using Helion.Util;
using System;
using System.Collections.Generic;
using static Helion.World.Entities.Definition.States.EntityActionFunctions;

namespace Helion.Dehacked;

public partial class DehackedDefinition
{
    public static readonly string SoulsphereClass = "Soulsphere";
    public static readonly string MegasphereHealthClass = "MegasphereHealth";
    public static readonly string BFG900Class = "BFG9000";
    public static readonly string ArmorBonusClass = "ArmorBonus";
    public static readonly string HealthBonusClass = "HealthBonus";
    public static readonly string GreenArmorClassName = "GreenArmor";
    public static readonly string BlueArmorClassName = "BlueArmor";

    public const int GreenArmorClassNum = 1;
    public const int BlueArmorClassNum = 2;

    public readonly string[] AmmoNames = new string[]
    {
        "Clip",
        "Shell",
        "Cell",
        "RocketAmmo"
    };

    public readonly string[] AmmoDoubleNames = new string[]
    {
        "ClipBox",
        "ShellBox",
        "CellPack",
        "RocketBox"
    };

    public readonly string[] ActorNames = new string[]
    {
        "DoomPlayer",               // MT_PLAYER
		"ZombieMan",				// MT_POSSESSED
		"ShotgunGuy",				// MT_SHOTGUY
		"Archvile",					// MT_VILE
		"ArchvileFire",				// MT_FIRE
		"Revenant",					// MT_UNDEAD
		"RevenantTracer",			// MT_TRACER
		"RevenantTracerSmoke",		// MT_SMOKE
		"Fatso",					// MT_FATSO
		"FatShot",					// MT_FATSHOT
		"ChaingunGuy",              // MT_CHAINGUY
		"DoomImp",					// MT_TROOP
		"Demon",					// MT_SERGEANT
		"Spectre",					// MT_SHADOWS
		"Cacodemon",				// MT_HEAD
		"BaronOfHell",				// MT_BRUISER
		"BaronBall",				// MT_BRUISERSHOT
		"HellKnight",				// MT_KNIGHT
		"LostSoul",					// MT_SKULL
		"SpiderMastermind",			// MT_SPIDER
		"Arachnotron",				// MT_BABY
		"Cyberdemon",				// MT_CYBORG
		"PainElemental",			// MT_PAIN
		"WolfensteinSS",			// MT_WOLFSS
		"CommanderKeen",			// MT_KEEN
		"BossBrain",				// MT_BOSSBRAIN
		"BossEye",					// MT_BOSSSPIT
		"BossTarget",				// MT_BOSSTARGET
		"SpawnShot",				// MT_SPAWNSHOT
		"SpawnFire",				// MT_SPAWNFIRE
		"ExplosiveBarrel",			// MT_BARREL
		"DoomImpBall",				// MT_TROOPSHOT
		"CacodemonBall",			// MT_HEADSHOT
		"rocket",					// MT_ROCKET
		"PlasmaBall",				// MT_PLASMA
		"BFGBall",					// MT_BFG
		"ArachnotronPlasma",		// MT_ARACHPLAZ
		"BulletPuff",				// MT_PUFF
		"Blood",					// MT_BLOOD
		"TeleportFog",				// MT_TFOG
		"ItemFog",				    // MT_IFOG
		"TeleportDest",				// MT_TELEPORTMAN
		"BFGExtra",					// MT_EXTRABFG
		"GreenArmor",				// MT_MISC0
		"BlueArmor",				// MT_MISC1
		"HealthBonus",			    // MT_MISC2
		"ArmorBonus",				// MT_MISC3
		"BlueCard",					// MT_MISC4
		"RedCard",					// MT_MISC5
		"YellowCard",				// MT_MISC6
		"YellowSkull",				// MT_MISC7
		"RedSkull",					// MT_MISC8
		"BlueSkull",				// MT_MISC9
		"Stimpack",					// MT_MISC10
		"Medikit",					// MT_MISC11
		"Soulsphere",				// MT_MISC12
		"InvulnerabilitySphere",	// MT_INV
		"Berserk",					// MT_MISC13
		"BlurSphere",				// MT_INS
		"RadSuit",					// MT_MISC14
		"Allmap",					// MT_MISC15
		"Infrared",					// MT_MISC16
		"Megasphere",               // MT_MEGA
        "Clip",                     // MT_CLIP
        "ClipBox",					// MT_MISC17
		"RocketAmmo",				// MT_MISC18
		"RocketBox",				// MT_MISC19
		"Cell",						// MT_MISC20
		"CellPack",					// MT_MISC21
		"Shell",					// MT_MISC22
		"ShellBox",					// MT_MISC23
		"Backpack",					// MT_MISC24
		"BFG9000",					// MT_MISC25
		"Chaingun",					// MT_CHAINGUN
		"Chainsaw",					// MT_MISC26
		"RocketLauncher",			// MT_MISC27
		"PlasmaRifle",				// MT_MISC28
		"Shotgun",					// MT_SHOTGUN
		"SuperShotgun",				// MT_SUPERSHOTGUN
		"TechLamp",					// MT_MISC29
		"TechLamp2",				// MT_MISC30
		"Column",					// MT_MISC31
		"TallGreenColumn",			// MT_MISC32
		"ShortGreenColumn",			// MT_MISC33
		"TallRedColumn",			// MT_MISC34
		"ShortRedColumn",			// MT_MISC35
		"SkullColumn",				// MT_MISC36
		"HeartColumn",				// MT_MISC37
		"EvilEye",					// MT_MISC38
		"FloatingSkull",			// MT_MISC39
		"TorchTree",				// MT_MISC40
		"BlueTorch",				// MT_MISC41
		"GreenTorch",				// MT_MISC42
		"RedTorch",					// MT_MISC43
		"ShortBlueTorch",			// MT_MISC44
		"ShortGreenTorch",			// MT_MISC45
		"ShortRedTorch",			// MT_MISC46
		"Stalagtite",				// MT_MISC47
		"TechPillar",				// MT_MISC48
		"Candlestick",				// MT_MISC49
		"Candelabra",				// MT_MISC50
		"BloodyTwitch",				// MT_MISC51
		"Meat2",					// MT_MISC52
		"Meat3",					// MT_MISC53
		"Meat4",					// MT_MISC54
		"Meat5",					// MT_MISC55
		"NonsolidMeat2",			// MT_MISC56
		"NonsolidMeat4",			// MT_MISC57
		"NonsolidMeat3",			// MT_MISC58
		"NonsolidMeat5",			// MT_MISC59
		"NonsolidTwitch",			// MT_MISC60
		"DeadCacodemon",			// MT_MISC61
		"DeadMarine",				// MT_MISC62
		"DeadZombieMan",			// MT_MISC63
		"DeadDemon",				// MT_MISC64
		"DeadLostSoul",				// MT_MISC65
		"DeadDoomImp",				// MT_MISC66
		"DeadShotgunGuy",			// MT_MISC67
		"GibbedCorpse",				// MT_MISC68
		"GibbedMarineExtra",		// MT_MISC69
		"HeadsOnAStick",			// MT_MISC70
		"Gibs",						// MT_MISC71
		"HeadOnAStick",				// MT_MISC72
		"HeadCandles",				// MT_MISC73
		"DeadStick",				// MT_MISC74
		"LiveStick",				// MT_MISC75
		"BigTree",					// MT_MISC76
		"BurningBarrel",			// MT_MISC77
		"HangNoGuts",				// MT_MISC78
		"HangBNoBrain",				// MT_MISC79
		"HangTLookingDown",			// MT_MISC80
		"HangTSkull",				// MT_MISC81
		"HangTLookingUp",			// MT_MISC82
		"HangTNoBrain",				// MT_MISC83
		"ColonGibs",				// MT_MISC84
		"SmallBloodPool",			// MT_MISC85
		"BrainStem",				// MT_MISC86
        "PointPusher",              // MT_PUSH
        "PointPuller",              // MT_PULL
        "MBFHelperDog",             // MT_DOGS
        "PlasmaBall1",              // MT_PLASMA1
        "PlasmaBall2",              // MT_PLASMA2
        "EvilSceptre",              // MT_SCEPTRE
        "UnholyBible",              // MT_BIBLE
        "MusicChanger",             // MT_MUSICSOURCE
    };

    public Dictionary<string, string> PickupLookup = new(StringComparer.OrdinalIgnoreCase)
    {
        { "ARM1", "GreenArmor" },
        { "ARM2", "BlueArmor" },
        { "BON1", "HealthBonus" },
        { "BON2", "ArmorBonus" },
        { "SOUL", "Soulsphere" },
        { "MEGA", "Megasphere" },
        { "BKEY", "BlueCard" },
        { "YKEY", "YellowCard" },
        { "RKEY", "RedCard" },
        { "BSKU", "BlueSkull" },
        { "YSKU", "YellowSkull" },
        { "RSKU", "RedSkull" },
        { "STIM", "Stimpack" },
        { "MEDI", "Medikit" },
        { "PINV", "InvulnerabilitySphere" },
        { "PSTR", "Berserk" },
        { "PINS", "BlurSphere" },
        { "SUIT", "RadSuit" },
        { "PMAP", "Allmap" },
        { "PVIS", "Infrared" },
        { "CLIP", "Clip" },
        { "AMMO", "ClipBox" },
        { "ROCK", "RocketAmmo" },
        { "BROK", "RocketBox" },
        { "CELL", "Cell" },
        { "CELP", "CellPack" },
        { "SHEL", "Shell" },
        { "SBOX", "ShellBox" },
        { "BPAK", "Backpack" },
        { "BFUG", "BFG9000" },
        { "MGUN", "Chaingun" },
        { "CSAW", "Chainsaw" },
        { "LAUN", "RocketLauncher" },
        { "PLAS", "PlasmaRifle" },
        { "SHOT", "Shotgun" },
        { "SGN2", "SuperShotgun" },
    };

    public readonly HashSet<string> SpriteNames = new(StringComparer.OrdinalIgnoreCase)
    {
        "TROO",
        "SHTG",
        "PUNG",
        "PISG",
        "PISF",
        "SHTF",
        "SHT2",
        "CHGG",
        "CHGF",
        "MISG",
        "MISF",
        "SAWG",
        "PLSG",
        "PLSF",
        "BFGG",
        "BFGF",
        "BLUD",
        "PUFF",
        "BAL1",
        "BAL2",
        "PLSS",
        "PLSE",
        "MISL",
        "BFS1",
        "BFE1",
        "BFE2",
        "TFOG",
        "IFOG",
        "PLAY",
        "POSS",
        "SPOS",
        "VILE",
        "FIRE",
        "FATB",
        "FBXP",
        "SKEL",
        "MANF",
        "FATT",
        "CPOS",
        "SARG",
        "HEAD",
        "BAL7",
        "BOSS",
        "BOS2",
        "SKUL",
        "SPID",
        "BSPI",
        "APLS",
        "APBX",
        "CYBR",
        "PAIN",
        "SSWV",
        "KEEN",
        "BBRN",
        "BOSF",
        "ARM1",
        "ARM2",
        "BAR1",
        "BEXP",
        "FCAN",
        "BON1",
        "BON2",
        "BKEY",
        "RKEY",
        "YKEY",
        "BSKU",
        "RSKU",
        "YSKU",
        "STIM",
        "MEDI",
        "SOUL",
        "PINV",
        "PSTR",
        "PINS",
        "MEGA",
        "SUIT",
        "PMAP",
        "PVIS",
        "CLIP",
        "AMMO",
        "ROCK",
        "BROK",
        "CELL",
        "CELP",
        "SHEL",
        "SBOX",
        "BPAK",
        "BFUG",
        "MGUN",
        "CSAW",
        "LAUN",
        "PLAS",
        "SHOT",
        "SGN2",
        "COLU",
        "SMT2",
        "GOR1",
        "POL2",
        "POL5",
        "POL4",
        "POL3",
        "POL1",
        "POL6",
        "GOR2",
        "GOR3",
        "GOR4",
        "GOR5",
        "SMIT",
        "COL1",
        "COL2",
        "COL3",
        "COL4",
        "CAND",
        "CBRA",
        "COL6",
        "TRE1",
        "TRE2",
        "ELEC",
        "CEYE",
        "FSKU",
        "COL5",
        "TBLU",
        "TGRN",
        "TRED",
        "SMBT",
        "SMGT",
        "SMRT",
        "HDB1",
        "HDB2",
        "HDB3",
        "HDB4",
        "HDB5",
        "HDB6",
        "POB1",
        "POB2",
        "BRS1",
        "TLMP",
        "TLP2",
        "TNT1",
    };

    public readonly string[] SoundStrings = new string[]
    {
        string.Empty,
        "weapons/pistol",
        "weapons/shotgf",
        "weapons/shotgr",
        "weapons/sshotf",
        "weapons/sshoto",
        "weapons/sshotc",
        "weapons/sshotl",
        "weapons/plasmaf",
        "weapons/bfgf",
        "weapons/sawup",
        "weapons/sawidle",
        "weapons/sawfull",
        "weapons/sawhit",
        "weapons/rocklf",
        "weapons/bfgx",
        "imp/attack",
        "imp/shotx",
        "plats/pt1_strt",
        "plats/pt1_stop",
        "doors/dr1_open",
        "doors/dr1_clos",
        "plats/pt1_mid",
        "switches/normbutn",
        "switches/exitbutn",
        "*pain100_1",
        "demon/pain",
        "grunt/pain",
        "vile/pain",
        "fatso/pain",
        "pain/pain",
        "misc/gibbed",
        "misc/i_pkup",
        "misc/w_pkup",
        "*land1",
        "misc/teleport",
        "grunt/sight1",
        "grunt/sight2",
        "grunt/sight3",
        "imp/sight1",
        "imp/sight2",
        "demon/sight",
        "caco/sight",
        "baron/sight",
        "cyber/sight",
        "spider/sight",
        "baby/sight",
        "knight/sight",
        "vile/sight",
        "fatso/sight",
        "pain/sight",
        "skull/melee",
        "demon/melee",
        "skeleton/melee",
        "vile/start",
        "imp/melee",
        "skeleton/swing",
        "*death1",
        "*xdeath1",
        "grunt/death1",
        "grunt/death2",
        "grunt/death3",
        "imp/death1",
        "imp/death2",
        "demon/death",
        "caco/death",
        "misc/unused",
        "baron/death",
        "cyber/death",
        "spider/death",
        "baby/death",
        "vile/death",
        "knight/death",
        "pain/death",
        "skeleton/death",
        "grunt/active",
        "imp/active",
        "demon/active",
        "baby/active",
        "baby/walk",
        "vile/active",
        "*grunt1",
        "world/barrelx",
        "*fist",
        "cyber/hoof",
        "spider/walk",
        "weapons/chngun",
        "misc/chat2",
        "doors/dr2_open",
        "doors/dr2_clos",
        "misc/spawn",
        "vile/firecrkl",
        "vile/firestrt",
        "misc/p_pkup",
        "brain/spit",
        "brain/cube",
        "brain/sight",
        "brain/pain",
        "brain/death",
        "fatso/attack",
        "gatso/death",
        "wolfss/sight",
        "wolfss/death",
        "keen/pain",
        "keen/death",
        "skeleton/active",
        "skeleton/sight",
        "skeleton/attack",
        "misc/chat",
        "misc/teamchat",
        "dog/sight",
        "dog/attack",
        "dog/active",
        "dog/death",
        "dog/pain",
        "misc/secret",
    };

    [Flags]
    public enum ThingProperties : uint
    {
        SPECIAL = 0x00000001,
        SOLID = 0x00000002,
        SHOOTABLE = 0x00000004,
        NOSECTOR = 0x00000008,
        NOBLOCKMAP = 0x00000010,
        AMBUSH = 0x00000020,
        JUSTHIT = 0x00000040,
        JUSTATTACKED = 0x00000080,
        SPAWNCEILING = 0x00000100,
        NOGRAVITY = 0x00000200,
        DROPOFF = 0x00000400,
        PICKUP = 0x00000800,
        NOCLIP = 0x00001000,
        SLIDE = 0x00002000,
        FLOAT = 0x00004000,
        TELEPORT = 0x00008000,
        MISSILE = 0x00010000,
        DROPPED = 0x00020000,
        SHADOW = 0x00040000,
        NOBLOOD = 0x00080000,
        CORPSE = 0x00100000,
        INFLOAT = 0x00200000,
        COUNTKILL = 0x00400000,
        COUNTITEM = 0x00800000,
        SKULLFLY = 0x01000000,
        NOTDMATCH = 0x02000000,
        TRANSLATION1 = 0x04000000,
        TRANSLATION2 = 0x08000000,
        TOUCHY = 0x10000000,
        BOUNCES = 0x20000000,
        FRIEND = 0x40000000,
        TRANSLUCENT = 0x80000000,
    };

    [Flags]
    public enum Mbf21ThingFlags : uint
    {
        LOGRAV = 0x00001, // Lower gravity (1/8)
        SHORTMRANGE = 0x00002, // Short missile range(archvile)
        DMGIGNORED = 0x00004, //Other things ignore its attacks(archvile)
        NORADIUSDMG = 0x00008, // Doesn't take splash damage (cyberdemon, mastermind)
        FORCERADIUSDMG = 0x00010,  // Thing causes splash damage even if the target shouldn't
        HIGHERMPROB = 0x00020, // Higher missile attack probability(cyberdemon)
        RANGEHALF = 0x00040, // Use half distance for missile attack probability(cyberdemon, mastermind, revenant, lost soul)
        NOTHRESHOLD = 0x00080, 	//Has no targeting threshold(archvile)
        LONGMELEE = 0x00100, //	Has long melee range(revenant)
        BOSS = 0x00200, 	// Full volume see / death sound & splash immunity(from heretic)
        MAP07BOSS1 = 0x00400, // Tag 666 "boss" on doom 2 map 7 (mancubus)
        MAP07BOSS2 = 0x00800, // Tag 667 "boss" on doom 2 map 7 (arachnotron)
        E1M8BOSS = 0x01000, // E1M8 boss(baron)
        E2M8BOSS = 0x02000, // E2M8 boss(cyberdemon)
        E3M8BOSS = 0x04000, 	// E3M8 boss(mastermind)
        E4M6BOSS = 0x08000, // E4M6 boss(cyberdemon)
        E4M8BOSS = 0x10000, // E4M8 boss(mastermind)
        RIP = 0x20000, 	// Ripper projectile(does not disappear on impact)
        FULLVOLSOUNDS = 0x40000, 	// Full volume see / death sounds(cyberdemon, mastermind)
    }

    [Flags]
    public enum Mbf21WeaponFlags : uint
    {
        NOTHRUST = 0x001, 	// Doesn't thrust things
        SILENT = 0x002, // eapon is silent
        NOAUTOFIRE = 0x004, // 	Weapon won't autofire when swapped to
        FLEEMELEE =	0x008, // Monsters consider it a melee weapon
        AUTOSWITCHFROM = 0x010, // Can be switched away from when ammo is picked up
        NOAUTOSWITCHTO = 0x020, // Cannot be switched to when ammo is picked up
    }

    [Flags]
    public enum Mbf21FrameFlags : uint
    {
        SKILL5FAST = 0x001,   // Tics halve on nightmare skill (demon)
    }

    public readonly IReadOnlyDictionary<string, uint> ThingPropertyStrings = new Dictionary<string, uint>(StringComparer.OrdinalIgnoreCase)
    {
        { "SPECIAL", 0x00000001 },
        { "SOLID", 0x00000002 },
        { "SHOOTABLE", 0x00000004 },
        { "NOSECTOR", 0x00000008 },
        { "NOBLOCKMAP", 0x00000010 },
        { "AMBUSH", 0x00000020 },
        { "JUSTHIT", 0x00000040 },
        { "JUSTATTACKED", 0x00000080 },
        { "SPAWNCEILING", 0x00000100 },
        { "NOGRAVITY", 0x00000200 },
        { "DROPOFF", 0x00000400 },
        { "PICKUP", 0x00000800 },
        { "NOCLIP", 0x00001000 },
        { "SLIDE", 0x00002000 },
        { "FLOAT", 0x00004000 },
        { "TELEPORT", 0x00008000 },
        { "MISSILE", 0x00010000 },
        { "DROPPED", 0x00020000 },
        { "SHADOW", 0x00040000 },
        { "NOBLOOD", 0x00080000 },
        { "CORPSE", 0x00100000 },
        { "INFLOAT", 0x00200000 },
        { "COUNTKILL", 0x00400000 },
        { "COUNTITEM", 0x00800000 },
        { "SKULLFLY", 0x01000000 },
        { "NOTDMATCH", 0x02000000 },
        { "TRANSLATION1", 0x04000000 },
        { "TRANSLATION2", 0x08000000 },
        { "TOUCHY", 0x10000000 },
        { "BOUNCES", 0x20000000 },
        { "FRIEND", 0x40000000 },
        { "TRANSLUCENT", 0x80000000 }
    };

    public readonly IReadOnlyDictionary<string, uint> ThingPropertyStringsMbf21 = new Dictionary<string, uint>(StringComparer.OrdinalIgnoreCase)
    {
        { "LOGRAV", 0x00000001 },
        { "SHORTMRANGE", 0x00000002 },
        { "DMGIGNORED", 0x00000004 },
        { "NORADIUSDMG", 0x00000008 },
        { "FORCERADIUSDMG", 0x00000010 },
        { "HIGHERMPROB", 0x00000020 },
        { "RANGEHALF", 0x00000040 },
        { "NOTHRESHOLD", 0x00000080 },
        { "LONGMELEE", 0x00000100 },
        { "BOSS", 0x00000200 },
        { "MAP07BOSS1", 0x00000400 },
        { "MAP07BOSS2", 0x00000800 },
        { "E1M8BOSS", 0x00001000 },
        { "E2M8BOSS", 0x00002000 },
        { "E3M8BOSS", 0x00004000 },
        { "E4M6BOSS", 0x00008000 },
        { "E4M8BOSS", 0x00010000 },
        { "RIP", 0x00020000 },
        { "FULLVOLSOUNDS", 0x00040000 },
    };

    public readonly IReadOnlyDictionary<string, uint> WeaponPropertyStringsMbf21 = new Dictionary<string, uint>(StringComparer.OrdinalIgnoreCase)
    {
        { "NOTHRUST", 0x00000001 },
        { "SILENT", 0x00000002 },
        { "NOAUTOFIRE", 0x00000004 },
        { "FLEEMELEE", 0x00000008 },
        { "AUTOSWITCHFROM", 0x00000010 },
        { "NOAUTOSWITCHTO", 0x00000020 },
    };

    public readonly IReadOnlyDictionary<string, uint> FramePropertyStringsMbf21 = new Dictionary<string, uint>(StringComparer.OrdinalIgnoreCase)
    {
        { "SKILL5FAST", 0x00000001 },
    };

    public class FrameStateLookup
    {
        public FrameStateLookup(string label, int offset)
        {
            Label = label;
            Offset = offset;
        }

        public string Label { get; set; }
        public int Offset { get; set; }
    }

    public readonly IReadOnlyDictionary<ThingState, FrameStateLookup> FrameLookup = new Dictionary<ThingState, FrameStateLookup>()
    {
        { ThingState.NULL,          new("Actor::null",                  0) },
        { ThingState.LIGHTDONE,     new("Actor::null",                  0) },

        { ThingState.PUNCH,         new("Fist::ready",                  0) },
        { ThingState.PUNCHDOWN,     new("Fist::deselect",               0) },
        { ThingState.PUNCHUP,       new("Fist::select",                 0) },
        { ThingState.PUNCH1,        new("Fist::fire",                   0) },
        { ThingState.PUNCH2,        new("Fist::fire",                   1) },
        { ThingState.PUNCH3,        new("Fist::fire",                   2) },
        { ThingState.PUNCH4,        new("Fist::fire",                   3) },
        { ThingState.PUNCH5,        new("Fist::fire",                   4) },

        { ThingState.PISTOL,        new("Pistol::ready",                0) },
        { ThingState.PISTOLDOWN,    new("Pistol::deselect",             0) },
        { ThingState.PISTOLUP,      new("Pistol::select",               0) },
        { ThingState.PISTOL1,       new("Pistol::fire",                 0) },
        { ThingState.PISTOL2,       new("Pistol::fire",                 1) },
        { ThingState.PISTOL3,       new("Pistol::fire",                 2) },
        { ThingState.PISTOL4,       new("Pistol::fire",                 3) },
        { ThingState.PISTOLFLASH,   new("Pistol::flash",                0) },

        { ThingState.SGUN,          new("Shotgun::ready",               0) },
        { ThingState.SGUNDOWN,      new("Shotgun::deselect",            0) },
        { ThingState.SGUNUP,        new("Shotgun::select",              0) },
        { ThingState.SGUN1,         new("Shotgun::fire",                0) },
        { ThingState.SGUN2,         new("Shotgun::fire",                1) },
        { ThingState.SGUN3,         new("Shotgun::fire",                2) },
        { ThingState.SGUN4,         new("Shotgun::fire",                3) },
        { ThingState.SGUN5,         new("Shotgun::fire",                4) },
        { ThingState.SGUN6,         new("Shotgun::fire",                5) },
        { ThingState.SGUN7,         new("Shotgun::fire",                6) },
        { ThingState.SGUN8,         new("Shotgun::fire",                7) },
        { ThingState.SGUN9,         new("Shotgun::fire",                8) },
        { ThingState.SGUNFLASH1,    new("Shotgun::flash",               0) },
        { ThingState.SGUNFLASH2,    new("Shotgun::flash",               1) },

        { ThingState.DSGUN,         new("SuperShotgun::ready",          0) },
        { ThingState.DSGUNDOWN,     new("SuperShotgun::deselect",       0) },
        { ThingState.DSGUNUP,       new("SuperShotgun::select",         0) },
        { ThingState.DSGUN1,        new("SuperShotgun::fire",           0) },
        { ThingState.DSGUN2,        new("SuperShotgun::fire",           1) },
        { ThingState.DSGUN3,        new("SuperShotgun::fire",           2) },
        { ThingState.DSGUN4,        new("SuperShotgun::fire",           3) },
        { ThingState.DSGUN5,        new("SuperShotgun::fire",           4) },
        { ThingState.DSGUN6,        new("SuperShotgun::fire",           5) },
        { ThingState.DSGUN7,        new("SuperShotgun::fire",           6) },
        { ThingState.DSGUN8,        new("SuperShotgun::fire",           7) },
        { ThingState.DSGUN9,        new("SuperShotgun::fire",           8) },
        { ThingState.DSGUN10,       new("SuperShotgun::fire",           9) },
        { ThingState.DSNR1,         new("SuperShotgun::fire",           10) },
        { ThingState.DSNR2,         new("SuperShotgun::fire",           11) },
        { ThingState.DSGUNFLASH1,   new("SuperShotgun::flash",          0) },
        { ThingState.DSGUNFLASH2,   new("SuperShotgun::flash",          1) },

        { ThingState.CHAIN,         new("Chaingun::ready",              0) },
        { ThingState.CHAINDOWN,     new("Chaingun::deselect",           0) },
        { ThingState.CHAINUP,       new("Chaingun::select",             0) },
        { ThingState.CHAIN1,        new("Chaingun::fire",               0) },
        { ThingState.CHAIN2,        new("Chaingun::fire",               1) },
        { ThingState.CHAIN3,        new("Chaingun::fire",               2) },
        { ThingState.CHAINFLASH1,   new("Chaingun::flash",              0) },
        { ThingState.CHAINFLASH2,   new("Chaingun::flash",              1) },

        { ThingState.MISSILE,       new("RocketLauncher::ready",        0) },
        { ThingState.MISSILEDOWN,   new("RocketLauncher::deselect",     0) },
        { ThingState.MISSILEUP,     new("RocketLauncher::select",       0) },
        { ThingState.MISSILE1,      new("RocketLauncher::fire",         0) },
        { ThingState.MISSILE2,      new("RocketLauncher::fire",         1) },
        { ThingState.MISSILE3,      new("RocketLauncher::fire",         2) },
        { ThingState.MISSILEFLASH1, new("RocketLauncher::flash",        0) },
        { ThingState.MISSILEFLASH2, new("RocketLauncher::flash",        1) },
        { ThingState.MISSILEFLASH3, new("RocketLauncher::flash",        2) },
        { ThingState.MISSILEFLASH4, new("RocketLauncher::flash",        3) },

        { ThingState.SAW,           new("Chainsaw::ready",              0) },
        { ThingState.SAWDOWN,       new("Chainsaw::deselect",           0) },
        { ThingState.SAWUP,         new("Chainsaw::select",             0) },
        { ThingState.SAW1,          new("Chainsaw::fire",               0) },
        { ThingState.SAW2,          new("Chainsaw::fire",               1) },
        { ThingState.SAW3,          new("Chainsaw::fire",               2) },

        { ThingState.PLASMA,        new("PlasmaRifle::ready",           0) },
        { ThingState.PLASMADOWN,    new("PlasmaRifle::deselect",        0) },
        { ThingState.PLASMAUP,      new("PlasmaRifle::select",          0) },
        { ThingState.PLASMA1,       new("PlasmaRifle::fire",            0) },
        { ThingState.PLASMA2,       new("PlasmaRifle::fire",            1) },
        { ThingState.PLASMAFLASH1,  new("PlasmaRifle::flash",           0) },
        { ThingState.PLASMAFLASH2,  new("PlasmaRifle::flash",           1) },

        { ThingState.BFG,           new("BFG9000::ready",               0) },
        { ThingState.BFGDOWN,       new("BFG9000::deselect",            0) },
        { ThingState.BFGUP,         new("BFG9000::select",              0) },
        { ThingState.BFG1,          new("BFG9000::fire",                0) },
        { ThingState.BFG2,          new("BFG9000::fire",                1) },
        { ThingState.BFG3,          new("BFG9000::fire",                2) },
        { ThingState.BFG4,          new("BFG9000::fire",                3) },
        { ThingState.BFGFLASH1,     new("BFG9000::flash",               0) },
        { ThingState.BFGFLASH2,     new("BFG9000::flash",               1) },

        { ThingState.BLOOD1,        new("Blood::spawn",                 0) },
        { ThingState.BLOOD2,        new("Blood::spawn",                 1) },
        { ThingState.BLOOD3,        new("Blood::spawn",                 2) },

        { ThingState.PUFF1,         new("BulletPuff::spawn",            0) },
        { ThingState.PUFF2,         new("BulletPuff::spawn",            1) },
        { ThingState.PUFF3,         new("BulletPuff::spawn",            2) },
        { ThingState.PUFF4,         new("BulletPuff::spawn",            3) },

        { ThingState.TBALL1,        new("DoomImpBall::spawn",            0) },
        { ThingState.TBALL2,        new("DoomImpBall::spawn",            1) },
        { ThingState.TBALLX1,       new("DoomImpBall::death",            0) },
        { ThingState.TBALLX2,       new("DoomImpBall::death",            1) },
        { ThingState.TBALLX3,       new("DoomImpBall::death",            2) },

        { ThingState.RBALL1,        new("CacodemonBall::spawn",         0) },
        { ThingState.RBALL2,        new("CacodemonBall::spawn",         1) },
        { ThingState.RBALLX1,       new("CacodemonBall::death",         0) },
        { ThingState.RBALLX2,       new("CacodemonBall::death",         1) },
        { ThingState.RBALLX3,       new("CacodemonBall::death",         2) },

        { ThingState.PLASBALL,      new("PlasmaBall::spawn",            0) },
        { ThingState.PLASBALL2,     new("PlasmaBall::spawn",            1) },
        { ThingState.PLASEXP,       new("PlasmaBall::death",            0) },
        { ThingState.PLASEXP2,      new("PlasmaBall::death",            1) },
        { ThingState.PLASEXP3,      new("PlasmaBall::death",            2) },
        { ThingState.PLASEXP4,      new("PlasmaBall::death",            3) },
        { ThingState.PLASEXP5,      new("PlasmaBall::death",            4) },

        { ThingState.ROCKET,        new("Rocket::spawn",                0) },

        { ThingState.BFGSHOT,       new("BFGBall::spawn",               0) },
        { ThingState.BFGSHOT2,      new("BFGBall::spawn",               1) },
        { ThingState.BFGLAND,       new("BFGBall::death",               0) },
        { ThingState.BFGLAND2,      new("BFGBall::death",               1) },
        { ThingState.BFGLAND3,      new("BFGBall::death",               2) },
        { ThingState.BFGLAND4,      new("BFGBall::death",               3) },
        { ThingState.BFGLAND5,      new("BFGBall::death",               4) },
        { ThingState.BFGLAND6,      new("BFGBall::death",               5) },

        { ThingState.BFGEXP,        new("BFGBall::spawn",               0) },
        { ThingState.BFGEXP2,       new("BFGBall::spawn",               1) },
        { ThingState.BFGEXP3,       new("BFGBall::spawn",               2) },
        { ThingState.BFGEXP4,       new("BFGBall::spawn",               3) },

        { ThingState.EXPLODE1,      new("Rocket::death",                0) },
        { ThingState.EXPLODE2,      new("Rocket::death",                1) },
        { ThingState.EXPLODE3,      new("Rocket::death",                2) },

        { ThingState.TFOG,          new("TeleportFog::spawn",           0) },
        { ThingState.TFOG01,        new("TeleportFog::spawn",           1) },
        { ThingState.TFOG02,        new("TeleportFog::spawn",           2) },
        { ThingState.TFOG2,         new("TeleportFog::spawn",           3) },
        { ThingState.TFOG3,         new("TeleportFog::spawn",           4) },
        { ThingState.TFOG4,         new("TeleportFog::spawn",           5) },
        { ThingState.TFOG5,         new("TeleportFog::spawn",           6) },
        { ThingState.TFOG6,         new("TeleportFog::spawn",           7) },
        { ThingState.TFOG7,         new("TeleportFog::spawn",           8) },
        { ThingState.TFOG8,         new("TeleportFog::spawn",           9) },
        { ThingState.TFOG9,         new("TeleportFog::spawn",           10) },
        { ThingState.TFOG10,        new("TeleportFog::spawn",           11) },

        { ThingState.IFOG,          new("ItemFog::spawn",               0) },
        { ThingState.IFOG01,        new("ItemFog::spawn",               1) },
        { ThingState.IFOG02,        new("ItemFog::spawn",               2) },
        { ThingState.IFOG2,         new("ItemFog::spawn",               3) },
        { ThingState.IFOG3,         new("ItemFog::spawn",               4) },
        { ThingState.IFOG4,         new("ItemFog::spawn",               5) },
        { ThingState.IFOG5,         new("ItemFog::spawn",               6) },

        { ThingState.PLAY,          new("DoomPlayer::spawn",            0) },
        { ThingState.PLAY_RUN1,     new("DoomPlayer::see",              0) },
        { ThingState.PLAY_RUN2,     new("DoomPlayer::see",              1) },
        { ThingState.PLAY_RUN3,     new("DoomPlayer::see",              2) },
        { ThingState.PLAY_RUN4,     new("DoomPlayer::see",              3) },
        { ThingState.PLAY_ATK1,     new("DoomPlayer::missile",          0) },
        { ThingState.PLAY_ATK2,     new("DoomPlayer::missile",          1) },
        { ThingState.PLAY_PAIN,     new("DoomPlayer::pain",             0) },
        { ThingState.PLAY_PAIN2,    new("DoomPlayer::pain",             1) },
        { ThingState.PLAY_DIE1,     new("DoomPlayer::death",            0) },
        { ThingState.PLAY_DIE2,     new("DoomPlayer::death",            1) },
        { ThingState.PLAY_DIE3,     new("DoomPlayer::death",            2) },
        { ThingState.PLAY_DIE4,     new("DoomPlayer::death",            3) },
        { ThingState.PLAY_DIE5,     new("DoomPlayer::death",            4) },
        { ThingState.PLAY_DIE6,     new("DoomPlayer::death",            5) },
        { ThingState.PLAY_DIE7,     new("DoomPlayer::death",            6) },
        { ThingState.PLAY_XDIE1,    new("DoomPlayer::xdeath",           0) },
        { ThingState.PLAY_XDIE2,    new("DoomPlayer::xdeath",           1) },
        { ThingState.PLAY_XDIE3,    new("DoomPlayer::xdeath",           2) },
        { ThingState.PLAY_XDIE4,    new("DoomPlayer::xdeath",           3) },
        { ThingState.PLAY_XDIE5,    new("DoomPlayer::xdeath",           4) },
        { ThingState.PLAY_XDIE6,    new("DoomPlayer::xdeath",           5) },
        { ThingState.PLAY_XDIE7,    new("DoomPlayer::xdeath",           6) },
        { ThingState.PLAY_XDIE8,    new("DoomPlayer::xdeath",           7) },
        { ThingState.PLAY_XDIE9,    new("DoomPlayer::xdeath",           8) },

        { ThingState.POSS_STND,     new("Zombieman::spawn",             0) },
        { ThingState.POSS_STND2,    new("Zombieman::spawn",             1) },
        { ThingState.POSS_RUN1,     new("Zombieman::see",               0) },
        { ThingState.POSS_RUN2,     new("Zombieman::see",               1) },
        { ThingState.POSS_RUN3,     new("Zombieman::see",               2) },
        { ThingState.POSS_RUN4,     new("Zombieman::see",               3) },
        { ThingState.POSS_RUN5,     new("Zombieman::see",               4) },
        { ThingState.POSS_RUN6,     new("Zombieman::see",               5) },
        { ThingState.POSS_RUN7,     new("Zombieman::see",               6) },
        { ThingState.POSS_RUN8,     new("Zombieman::see",               7) },
        { ThingState.POSS_ATK1,     new("Zombieman::missile",           0) },
        { ThingState.POSS_ATK2,     new("Zombieman::missile",           1) },
        { ThingState.POSS_ATK3,     new("Zombieman::missile",           2) },
        { ThingState.POSS_PAIN,     new("Zombieman::pain",              0) },
        { ThingState.POSS_PAIN2,    new("Zombieman::pain",              1) },
        { ThingState.POSS_DIE1,     new("Zombieman::death",             0) },
        { ThingState.POSS_DIE2,     new("Zombieman::death",             1) },
        { ThingState.POSS_DIE3,     new("Zombieman::death",             2) },
        { ThingState.POSS_DIE4,     new("Zombieman::death",             3) },
        { ThingState.POSS_DIE5,     new("Zombieman::death",             4) },
        { ThingState.POSS_XDIE1,    new("Zombieman::xdeath",            0) },
        { ThingState.POSS_XDIE2,    new("Zombieman::xdeath",            1) },
        { ThingState.POSS_XDIE3,    new("Zombieman::xdeath",            2) },
        { ThingState.POSS_XDIE4,    new("Zombieman::xdeath",            3) },
        { ThingState.POSS_XDIE5,    new("Zombieman::xdeath",            4) },
        { ThingState.POSS_XDIE6,    new("Zombieman::xdeath",            5) },
        { ThingState.POSS_XDIE7,    new("Zombieman::xdeath",            6) },
        { ThingState.POSS_XDIE8,    new("Zombieman::xdeath",            7) },
        { ThingState.POSS_XDIE9,    new("Zombieman::xdeath",            8) },
        { ThingState.POSS_RAISE1,   new("Zombieman::raise",             0) },
        { ThingState.POSS_RAISE2,   new("Zombieman::raise",             1) },
        { ThingState.POSS_RAISE3,   new("Zombieman::raise",             2) },
        { ThingState.POSS_RAISE4,   new("Zombieman::raise",             3) },

        { ThingState.SPOS_STND,     new("Shotgunguy::spawn",            0) },
        { ThingState.SPOS_STND2,    new("Shotgunguy::spawn",            1) },
        { ThingState.SPOS_RUN1,     new("Shotgunguy::see",              0) },
        { ThingState.SPOS_RUN2,     new("Shotgunguy::see",              1) },
        { ThingState.SPOS_RUN3,     new("Shotgunguy::see",              2) },
        { ThingState.SPOS_RUN4,     new("Shotgunguy::see",              3) },
        { ThingState.SPOS_RUN5,     new("Shotgunguy::see",              4) },
        { ThingState.SPOS_RUN6,     new("Shotgunguy::see",              5) },
        { ThingState.SPOS_RUN7,     new("Shotgunguy::see",              6) },
        { ThingState.SPOS_RUN8,     new("Shotgunguy::see",              7) },
        { ThingState.SPOS_ATK1,     new("Shotgunguy::missile",          0) },
        { ThingState.SPOS_ATK2,     new("Shotgunguy::missile",          1) },
        { ThingState.SPOS_ATK3,     new("Shotgunguy::missile",          2) },
        { ThingState.SPOS_PAIN,     new("Shotgunguy::pain",             0) },
        { ThingState.SPOS_PAIN2,    new("Shotgunguy::pain",             1) },
        { ThingState.SPOS_DIE1,     new("Shotgunguy::death",            0) },
        { ThingState.SPOS_DIE2,     new("Shotgunguy::death",            1) },
        { ThingState.SPOS_DIE3,     new("Shotgunguy::death",            2) },
        { ThingState.SPOS_DIE4,     new("Shotgunguy::death",            3) },
        { ThingState.SPOS_DIE5,     new("Shotgunguy::death",            4) },
        { ThingState.SPOS_XDIE1,    new("Shotgunguy::xdeath",           0) },
        { ThingState.SPOS_XDIE2,    new("Shotgunguy::xdeath",           1) },
        { ThingState.SPOS_XDIE3,    new("Shotgunguy::xdeath",           2) },
        { ThingState.SPOS_XDIE4,    new("Shotgunguy::xdeath",           3) },
        { ThingState.SPOS_XDIE5,    new("Shotgunguy::xdeath",           4) },
        { ThingState.SPOS_XDIE6,    new("Shotgunguy::xdeath",           5) },
        { ThingState.SPOS_XDIE7,    new("Shotgunguy::xdeath",           6) },
        { ThingState.SPOS_XDIE8,    new("Shotgunguy::xdeath",           7) },
        { ThingState.SPOS_XDIE9,    new("Shotgunguy::xdeath",           8) },
        { ThingState.SPOS_RAISE1,   new("Shotgunguy::raise",            0) },
        { ThingState.SPOS_RAISE2,   new("Shotgunguy::raise",            1) },
        { ThingState.SPOS_RAISE3,   new("Shotgunguy::raise",            2) },
        { ThingState.SPOS_RAISE4,   new("Shotgunguy::raise",            3) },
        { ThingState.SPOS_RAISE5,   new("Shotgunguy::raise",            4) },

        { ThingState.VILE_STND,     new("Archvile::spawn",              0) },
        { ThingState.VILE_STND2,    new("Archvile::spawn",              1) },
        { ThingState.VILE_RUN1,     new("Archvile::see",                0) },
        { ThingState.VILE_RUN2,     new("Archvile::see",                1) },
        { ThingState.VILE_RUN3,     new("Archvile::see",                2) },
        { ThingState.VILE_RUN4,     new("Archvile::see",                3) },
        { ThingState.VILE_RUN5,     new("Archvile::see",                4) },
        { ThingState.VILE_RUN6,     new("Archvile::see",                5) },
        { ThingState.VILE_RUN7,     new("Archvile::see",                6) },
        { ThingState.VILE_RUN8,     new("Archvile::see",                7) },
        { ThingState.VILE_RUN9,     new("Archvile::see",                8) },
        { ThingState.VILE_RUN10,    new("Archvile::see",                9) },
        { ThingState.VILE_RUN11,    new("Archvile::see",                10) },
        { ThingState.VILE_RUN12,    new("Archvile::see",                11) },
        { ThingState.VILE_ATK1,     new("Archvile::missile",            0) },
        { ThingState.VILE_ATK2,     new("Archvile::missile",            1) },
        { ThingState.VILE_ATK3,     new("Archvile::missile",            2) },
        { ThingState.VILE_ATK4,     new("Archvile::missile",            3) },
        { ThingState.VILE_ATK5,     new("Archvile::missile",            4) },
        { ThingState.VILE_ATK6,     new("Archvile::missile",            5) },
        { ThingState.VILE_ATK7,     new("Archvile::missile",            6) },
        { ThingState.VILE_ATK8,     new("Archvile::missile",            7) },
        { ThingState.VILE_ATK9,     new("Archvile::missile",            8) },
        { ThingState.VILE_ATK10,    new("Archvile::missile",            9) },
        { ThingState.VILE_ATK11,    new("Archvile::missile",            10) },
        { ThingState.VILE_PAIN,     new("Archvile::pain",               0) },
        { ThingState.VILE_PAIN2,    new("Archvile::pain",               1) },
        { ThingState.VILE_HEAL1,    new("Archvile::heal",               0) },
        { ThingState.VILE_HEAL2,    new("Archvile::heal",               1) },
        { ThingState.VILE_HEAL3,    new("Archvile::heal",               2) },
        { ThingState.VILE_DIE1,     new("Archvile::death",              0) },
        { ThingState.VILE_DIE2,     new("Archvile::death",              1) },
        { ThingState.VILE_DIE3,     new("Archvile::death",              2) },
        { ThingState.VILE_DIE4,     new("Archvile::death",              3) },
        { ThingState.VILE_DIE5,     new("Archvile::death",              4) },
        { ThingState.VILE_DIE6,     new("Archvile::death",              5) },
        { ThingState.VILE_DIE7,     new("Archvile::death",              6) },
        { ThingState.VILE_DIE8,     new("Archvile::death",              7) },
        { ThingState.VILE_DIE9,     new("Archvile::death",              8) },
        { ThingState.VILE_DIE10,    new("Archvile::death",              9) },

        { ThingState.FIRE1,         new("ArchvileFire::spawn",          0) },
        { ThingState.FIRE2,         new("ArchvileFire::spawn",          1) },
        { ThingState.FIRE3,         new("ArchvileFire::spawn",          2) },
        { ThingState.FIRE4,         new("ArchvileFire::spawn",          3) },
        { ThingState.FIRE5,         new("ArchvileFire::spawn",          4) },
        { ThingState.FIRE6,         new("ArchvileFire::spawn",          5) },
        { ThingState.FIRE7,         new("ArchvileFire::spawn",          6) },
        { ThingState.FIRE8,         new("ArchvileFire::spawn",          7) },
        { ThingState.FIRE9,         new("ArchvileFire::spawn",          8) },
        { ThingState.FIRE10,        new("ArchvileFire::spawn",          9) },
        { ThingState.FIRE11,        new("ArchvileFire::spawn",          10) },
        { ThingState.FIRE12,        new("ArchvileFire::spawn",          11) },
        { ThingState.FIRE13,        new("ArchvileFire::spawn",          12) },
        { ThingState.FIRE14,        new("ArchvileFire::spawn",          13) },
        { ThingState.FIRE15,        new("ArchvileFire::spawn",          14) },
        { ThingState.FIRE16,        new("ArchvileFire::spawn",          15) },
        { ThingState.FIRE17,        new("ArchvileFire::spawn",          16) },
        { ThingState.FIRE18,        new("ArchvileFire::spawn",          17) },
        { ThingState.FIRE19,        new("ArchvileFire::spawn",          18) },
        { ThingState.FIRE20,        new("ArchvileFire::spawn",          19) },
        { ThingState.FIRE21,        new("ArchvileFire::spawn",          20) },
        { ThingState.FIRE22,        new("ArchvileFire::spawn",          21) },
        { ThingState.FIRE23,        new("ArchvileFire::spawn",          22) },
        { ThingState.FIRE24,        new("ArchvileFire::spawn",          23) },
        { ThingState.FIRE25,        new("ArchvileFire::spawn",          24) },
        { ThingState.FIRE26,        new("ArchvileFire::spawn",          25) },
        { ThingState.FIRE27,        new("ArchvileFire::spawn",          26) },
        { ThingState.FIRE28,        new("ArchvileFire::spawn",          27) },
        { ThingState.FIRE29,        new("ArchvileFire::spawn",          28) },
        { ThingState.FIRE30,        new("ArchvileFire::spawn",          29) },

        { ThingState.SMOKE1,        new("RevenantTracerSmoke::spawn",   0) },
        { ThingState.SMOKE2,        new("RevenantTracerSmoke::spawn",   1) },
        { ThingState.SMOKE3,        new("RevenantTracerSmoke::spawn",   2) },
        { ThingState.SMOKE4,        new("RevenantTracerSmoke::spawn",   3) },
        { ThingState.SMOKE5,        new("RevenantTracerSmoke::spawn",   4) },

        { ThingState.TRACER,        new("RevenantTracer::spawn",        0) },
        { ThingState.TRACER2,       new("RevenantTracer::spawn",        1) },

        { ThingState.TRACEEXP1,     new("RevenantTracer::death",        0) },
        { ThingState.TRACEEXP2,     new("RevenantTracer::death",        1) },
        { ThingState.TRACEEXP3,     new("RevenantTracer::death",        2) },

        { ThingState.SKEL_STND,     new("Revenant::spawn",              0) },
        { ThingState.SKEL_STND2,    new("Revenant::spawn",              1) },
        { ThingState.SKEL_RUN1,     new("Revenant::see",                0) },
        { ThingState.SKEL_RUN2,     new("Revenant::see",                1) },
        { ThingState.SKEL_RUN3,     new("Revenant::see",                2) },
        { ThingState.SKEL_RUN4,     new("Revenant::see",                3) },
        { ThingState.SKEL_RUN5,     new("Revenant::see",                4) },
        { ThingState.SKEL_RUN6,     new("Revenant::see",                5) },
        { ThingState.SKEL_RUN7,     new("Revenant::see",                6) },
        { ThingState.SKEL_RUN8,     new("Revenant::see",                7) },
        { ThingState.SKEL_RUN9,     new("Revenant::see",                8) },
        { ThingState.SKEL_RUN10,    new("Revenant::see",                9) },
        { ThingState.SKEL_RUN11,    new("Revenant::see",                10) },
        { ThingState.SKEL_FIST1,    new("Revenant::melee",              0) },
        { ThingState.SKEL_FIST2,    new("Revenant::melee",              1) },
        { ThingState.SKEL_FIST3,    new("Revenant::melee",              2) },
        { ThingState.SKEL_FIST4,    new("Revenant::melee",              3) },
        { ThingState.SKEL_MISS1,    new("Revenant::missile",            0) },
        { ThingState.SKEL_MISS2,    new("Revenant::missile",            1) },
        { ThingState.SKEL_MISS3,    new("Revenant::missile",            2) },
        { ThingState.SKEL_MISS4,    new("Revenant::missile",            3) },
        { ThingState.SKEL_PAIN,     new("Revenant::pain",               0) },
        { ThingState.SKEL_PAIN2,    new("Revenant::pain",               1) },
        { ThingState.SKEL_DIE1,     new("Revenant::death",              0) },
        { ThingState.SKEL_DIE2,     new("Revenant::death",              1) },
        { ThingState.SKEL_DIE3,     new("Revenant::death",              2) },
        { ThingState.SKEL_DIE4,     new("Revenant::death",              3) },
        { ThingState.SKEL_DIE5,     new("Revenant::death",              4) },
        { ThingState.SKEL_DIE6,     new("Revenant::death",              5) },
        { ThingState.SKEL_RAISE1,   new("Revenant::raise",              0) },
        { ThingState.SKEL_RAISE2,   new("Revenant::raise",              1) },
        { ThingState.SKEL_RAISE3,   new("Revenant::raise",              2) },
        { ThingState.SKEL_RAISE4,   new("Revenant::raise",              3) },
        { ThingState.SKEL_RAISE5,   new("Revenant::raise",              4) },
        { ThingState.SKEL_RAISE6,   new("Revenant::raise",              5) },

        { ThingState.FATSHOT1,      new("FatShot::spawn",               0) },
        { ThingState.FATSHOT2,      new("FatShot::spawn",               1) },
        { ThingState.FATSHOTX1,     new("FatShot::death",               0) },
        { ThingState.FATSHOTX2,     new("FatShot::death",               1) },
        { ThingState.FATSHOTX3,     new("FatShot::death",               2) },

        { ThingState.FATT_STND,     new("Fatso::spawn",                 0) },
        { ThingState.FATT_STND2,    new("Fatso::spawn",                 1) },
        { ThingState.FATT_RUN1,     new("Fatso::see",                   0) },
        { ThingState.FATT_RUN2,     new("Fatso::see",                   1) },
        { ThingState.FATT_RUN3,     new("Fatso::see",                   2) },
        { ThingState.FATT_RUN4,     new("Fatso::see",                   3) },
        { ThingState.FATT_RUN5,     new("Fatso::see",                   4) },
        { ThingState.FATT_RUN6,     new("Fatso::see",                   5) },
        { ThingState.FATT_RUN7,     new("Fatso::see",                   6) },
        { ThingState.FATT_RUN8,     new("Fatso::see",                   7) },
        { ThingState.FATT_RUN9,     new("Fatso::see",                   8) },
        { ThingState.FATT_RUN10,    new("Fatso::see",                   9) },
        { ThingState.FATT_RUN11,    new("Fatso::see",                   10) },
        { ThingState.FATT_RUN12,    new("Fatso::see",                   11) },
        { ThingState.FATT_ATK1,     new("Fatso::missile",               0) },
        { ThingState.FATT_ATK2,     new("Fatso::missile",               1) },
        { ThingState.FATT_ATK3,     new("Fatso::missile",               2) },
        { ThingState.FATT_ATK4,     new("Fatso::missile",               3) },
        { ThingState.FATT_ATK5,     new("Fatso::missile",               4) },
        { ThingState.FATT_ATK6,     new("Fatso::missile",               5) },
        { ThingState.FATT_ATK7,     new("Fatso::missile",               6) },
        { ThingState.FATT_ATK8,     new("Fatso::missile",               7) },
        { ThingState.FATT_ATK9,     new("Fatso::missile",               8) },
        { ThingState.FATT_ATK10,    new("Fatso::missile",               9) },
        { ThingState.FATT_PAIN,     new("Fatso::pain",                  0) },
        { ThingState.FATT_PAIN2,    new("Fatso::pain",                  1) },
        { ThingState.FATT_DIE1,     new("Fatso::death",                 0) },
        { ThingState.FATT_DIE2,     new("Fatso::death",                 1) },
        { ThingState.FATT_DIE3,     new("Fatso::death",                 2) },
        { ThingState.FATT_DIE4,     new("Fatso::death",                 3) },
        { ThingState.FATT_DIE5,     new("Fatso::death",                 4) },
        { ThingState.FATT_DIE6,     new("Fatso::death",                 5) },
        { ThingState.FATT_DIE7,     new("Fatso::death",                 6) },
        { ThingState.FATT_DIE8,     new("Fatso::death",                 7) },
        { ThingState.FATT_DIE9,     new("Fatso::death",                 8) },
        { ThingState.FATT_DIE10,    new("Fatso::death",                 9) },
        { ThingState.FATT_RAISE1,   new("Fatso::raise",                 0) },
        { ThingState.FATT_RAISE2,   new("Fatso::raise",                 1) },
        { ThingState.FATT_RAISE3,   new("Fatso::raise",                 2) },
        { ThingState.FATT_RAISE4,   new("Fatso::raise",                 3) },
        { ThingState.FATT_RAISE5,   new("Fatso::raise",                 4) },
        { ThingState.FATT_RAISE6,   new("Fatso::raise",                 5) },
        { ThingState.FATT_RAISE7,   new("Fatso::raise",                 6) },
        { ThingState.FATT_RAISE8,   new("Fatso::raise",                 7) },

        { ThingState.CPOS_STND,     new("ChaingunGuy::spawn",           0) },
        { ThingState.CPOS_STND2,    new("ChaingunGuy::spawn",           1) },
        { ThingState.CPOS_RUN1,     new("ChaingunGuy::see",             0) },
        { ThingState.CPOS_RUN2,     new("ChaingunGuy::see",             1) },
        { ThingState.CPOS_RUN3,     new("ChaingunGuy::see",             2) },
        { ThingState.CPOS_RUN4,     new("ChaingunGuy::see",             3) },
        { ThingState.CPOS_RUN5,     new("ChaingunGuy::see",             4) },
        { ThingState.CPOS_RUN6,     new("ChaingunGuy::see",             5) },
        { ThingState.CPOS_RUN7,     new("ChaingunGuy::see",             6) },
        { ThingState.CPOS_RUN8,     new("ChaingunGuy::see",             7) },
        { ThingState.CPOS_ATK1,     new("ChaingunGuy::missile",         0) },
        { ThingState.CPOS_ATK2,     new("ChaingunGuy::missile",         1) },
        { ThingState.CPOS_ATK3,     new("ChaingunGuy::missile",         2) },
        { ThingState.CPOS_ATK4,     new("ChaingunGuy::missile",         4) },
        { ThingState.CPOS_PAIN,     new("ChaingunGuy::pain",            0) },
        { ThingState.CPOS_PAIN2,    new("ChaingunGuy::pain",            1) },
        { ThingState.CPOS_DIE1,     new("ChaingunGuy::death",           0) },
        { ThingState.CPOS_DIE2,     new("ChaingunGuy::death",           1) },
        { ThingState.CPOS_DIE3,     new("ChaingunGuy::death",           2) },
        { ThingState.CPOS_DIE4,     new("ChaingunGuy::death",           3) },
        { ThingState.CPOS_DIE5,     new("ChaingunGuy::death",           4) },
        { ThingState.CPOS_DIE6,     new("ChaingunGuy::death",           5) },
        { ThingState.CPOS_DIE7,     new("ChaingunGuy::death",           6) },
        { ThingState.CPOS_XDIE1,    new("ChaingunGuy::xdeath",          0) },
        { ThingState.CPOS_XDIE2,    new("ChaingunGuy::xdeath",          1) },
        { ThingState.CPOS_XDIE3,    new("ChaingunGuy::xdeath",          2) },
        { ThingState.CPOS_XDIE4,    new("ChaingunGuy::xdeath",          3) },
        { ThingState.CPOS_XDIE5,    new("ChaingunGuy::xdeath",          4) },
        { ThingState.CPOS_XDIE6,    new("ChaingunGuy::xdeath",          5) },
        { ThingState.CPOS_RAISE1,   new("ChaingunGuy::raise",           0) },
        { ThingState.CPOS_RAISE2,   new("ChaingunGuy::raise",           1) },
        { ThingState.CPOS_RAISE3,   new("ChaingunGuy::raise",           2) },
        { ThingState.CPOS_RAISE4,   new("ChaingunGuy::raise",           3) },
        { ThingState.CPOS_RAISE5,   new("ChaingunGuy::raise",           4) },
        { ThingState.CPOS_RAISE6,   new("ChaingunGuy::raise",           5) },
        { ThingState.CPOS_RAISE7,   new("ChaingunGuy::raise",           6) },

        { ThingState.TROO_STND,     new("DoomImp::spawn",               0) },
        { ThingState.TROO_STND2,    new("DoomImp::spawn",               1) },
        { ThingState.TROO_RUN1,     new("DoomImp::see",                 0) },
        { ThingState.TROO_RUN2,     new("DoomImp::see",                 1) },
        { ThingState.TROO_RUN3,     new("DoomImp::see",                 2) },
        { ThingState.TROO_RUN4,     new("DoomImp::see",                 3) },
        { ThingState.TROO_RUN5,     new("DoomImp::see",                 4) },
        { ThingState.TROO_RUN6,     new("DoomImp::see",                 5) },
        { ThingState.TROO_RUN7,     new("DoomImp::see",                 6) },
        { ThingState.TROO_RUN8,     new("DoomImp::see",                 7) },
        { ThingState.TROO_ATK1,     new("DoomImp::missile",             0) },
        { ThingState.TROO_ATK2,     new("DoomImp::missile",             1) },
        { ThingState.TROO_ATK3,     new("DoomImp::missile",             2) },
        { ThingState.TROO_PAIN,     new("DoomImp::pain",                0) },
        { ThingState.TROO_PAIN2,    new("DoomImp::pain",                1) },
        { ThingState.TROO_DIE1,     new("DoomImp::death",               0) },
        { ThingState.TROO_DIE2,     new("DoomImp::death",               1) },
        { ThingState.TROO_DIE3,     new("DoomImp::death",               2) },
        { ThingState.TROO_DIE4,     new("DoomImp::death",               3) },
        { ThingState.TROO_DIE5,     new("DoomImp::death",               4) },
        { ThingState.TROO_XDIE1,    new("DoomImp::xdeath",              0) },
        { ThingState.TROO_XDIE2,    new("DoomImp::xdeath",              1) },
        { ThingState.TROO_XDIE3,    new("DoomImp::xdeath",              2) },
        { ThingState.TROO_XDIE4,    new("DoomImp::xdeath",              3) },
        { ThingState.TROO_XDIE5,    new("DoomImp::xdeath",              4) },
        { ThingState.TROO_XDIE6,    new("DoomImp::xdeath",              5) },
        { ThingState.TROO_XDIE7,    new("DoomImp::xdeath",              6) },
        { ThingState.TROO_XDIE8,    new("DoomImp::xdeath",              7) },
        { ThingState.TROO_RAISE1,   new("DoomImp::raise",               0) },
        { ThingState.TROO_RAISE2,   new("DoomImp::raise",               1) },
        { ThingState.TROO_RAISE3,   new("DoomImp::raise",               2) },
        { ThingState.TROO_RAISE4,   new("DoomImp::raise",               3) },
        { ThingState.TROO_RAISE5,   new("DoomImp::raise",               4) },

        { ThingState.SARG_STND,     new("Demon::spawn",                 0) },
        { ThingState.SARG_STND2,    new("Demon::spawn",                 1) },
        { ThingState.SARG_RUN1,     new("Demon::see",                   0) },
        { ThingState.SARG_RUN2,     new("Demon::see",                   1) },
        { ThingState.SARG_RUN3,     new("Demon::see",                   2) },
        { ThingState.SARG_RUN4,     new("Demon::see",                   3) },
        { ThingState.SARG_RUN5,     new("Demon::see",                   4) },
        { ThingState.SARG_RUN6,     new("Demon::see",                   5) },
        { ThingState.SARG_RUN7,     new("Demon::see",                   6) },
        { ThingState.SARG_RUN8,     new("Demon::see",                   7) },
        { ThingState.SARG_ATK1,     new("Demon::melee",                 0) },
        { ThingState.SARG_ATK2,     new("Demon::melee",                 1) },
        { ThingState.SARG_ATK3,     new("Demon::melee",                 2) },
        { ThingState.SARG_PAIN,     new("Demon::pain",                  0) },
        { ThingState.SARG_PAIN2,    new("Demon::pain",                  1) },
        { ThingState.SARG_DIE1,     new("Demon::death",                 0) },
        { ThingState.SARG_DIE2,     new("Demon::death",                 1) },
        { ThingState.SARG_DIE3,     new("Demon::death",                 2) },
        { ThingState.SARG_DIE4,     new("Demon::death",                 3) },
        { ThingState.SARG_DIE5,     new("Demon::death",                 4) },
        { ThingState.SARG_DIE6,     new("Demon::death",                 5) },
        { ThingState.SARG_RAISE1,   new("Demon::raise",                 0) },
        { ThingState.SARG_RAISE2,   new("Demon::raise",                 1) },
        { ThingState.SARG_RAISE3,   new("Demon::raise",                 2) },
        { ThingState.SARG_RAISE4,   new("Demon::raise",                 3) },
        { ThingState.SARG_RAISE5,   new("Demon::raise",                 4) },
        { ThingState.SARG_RAISE6,   new("Demon::raise",                 5) },

        { ThingState.HEAD_STND,     new("Cacodemon::spawn",             0) },
        { ThingState.HEAD_RUN1,     new("Cacodemon::see",               0) },
        { ThingState.HEAD_ATK1,     new("Cacodemon::missile",           0) },
        { ThingState.HEAD_ATK2,     new("Cacodemon::missile",           1) },
        { ThingState.HEAD_ATK3,     new("Cacodemon::missile",           2) },
        { ThingState.HEAD_PAIN,     new("Cacodemon::pain",              0) },
        { ThingState.HEAD_PAIN2,    new("Cacodemon::pain",              1) },
        { ThingState.HEAD_DIE1,     new("Cacodemon::death",             0) },
        { ThingState.HEAD_DIE2,     new("Cacodemon::death",             1) },
        { ThingState.HEAD_DIE3,     new("Cacodemon::death",             2) },
        { ThingState.HEAD_DIE4,     new("Cacodemon::death",             3) },
        { ThingState.HEAD_DIE5,     new("Cacodemon::death",             4) },
        { ThingState.HEAD_DIE6,     new("Cacodemon::death",             5) },
        { ThingState.HEAD_RAISE1,   new("Cacodemon::raise",             0) },
        { ThingState.HEAD_RAISE2,   new("Cacodemon::raise",             1) },
        { ThingState.HEAD_RAISE3,   new("Cacodemon::raise",             2) },
        { ThingState.HEAD_RAISE4,   new("Cacodemon::raise",             3) },
        { ThingState.HEAD_RAISE5,   new("Cacodemon::raise",             4) },
        { ThingState.HEAD_RAISE6,   new("Cacodemon::raise",             5) },

        { ThingState.BRBALL1,       new("CacodemonBall::spawn",         0) },
        { ThingState.BRBALL2,       new("CacodemonBall::spawn",         1) },
        { ThingState.BRBALLX1,      new("CacodemonBall::death",         0) },
        { ThingState.BRBALLX2,      new("CacodemonBall::death",         1) },
        { ThingState.BRBALLX3,      new("CacodemonBall::death",         2) },

        { ThingState.BOSS_STND,     new("BaronOfHell::spawn",           0) },
        { ThingState.BOSS_STND2,    new("BaronOfHell::spawn",           1) },
        { ThingState.BOSS_RUN1,     new("BaronOfHell::see",             0) },
        { ThingState.BOSS_RUN2,     new("BaronOfHell::see",             1) },
        { ThingState.BOSS_RUN3,     new("BaronOfHell::see",             2) },
        { ThingState.BOSS_RUN4,     new("BaronOfHell::see",             3) },
        { ThingState.BOSS_RUN5,     new("BaronOfHell::see",             4) },
        { ThingState.BOSS_RUN6,     new("BaronOfHell::see",             5) },
        { ThingState.BOSS_RUN7,     new("BaronOfHell::see",             6) },
        { ThingState.BOSS_RUN8,     new("BaronOfHell::see",             7) },
        { ThingState.BOSS_ATK1,     new("BaronOfHell::missile",         0) },
        { ThingState.BOSS_ATK2,     new("BaronOfHell::missile",         1) },
        { ThingState.BOSS_ATK3,     new("BaronOfHell::missile",         2) },
        { ThingState.BOSS_PAIN,     new("BaronOfHell::pain",            0) },
        { ThingState.BOSS_PAIN2,    new("BaronOfHell::pain",            1) },
        { ThingState.BOSS_DIE1,     new("BaronOfHell::death",           0) },
        { ThingState.BOSS_DIE2,     new("BaronOfHell::death",           1) },
        { ThingState.BOSS_DIE3,     new("BaronOfHell::death",           2) },
        { ThingState.BOSS_DIE4,     new("BaronOfHell::death",           3) },
        { ThingState.BOSS_DIE5,     new("BaronOfHell::death",           4) },
        { ThingState.BOSS_DIE6,     new("BaronOfHell::death",           5) },
        { ThingState.BOSS_DIE7,     new("BaronOfHell::death",           6) },
        { ThingState.BOSS_RAISE1,   new("BaronOfHell::raise",           0) },
        { ThingState.BOSS_RAISE2,   new("BaronOfHell::raise",           1) },
        { ThingState.BOSS_RAISE3,   new("BaronOfHell::raise",           2) },
        { ThingState.BOSS_RAISE4,   new("BaronOfHell::raise",           3) },
        { ThingState.BOSS_RAISE5,   new("BaronOfHell::raise",           4) },
        { ThingState.BOSS_RAISE6,   new("BaronOfHell::raise",           5) },
        { ThingState.BOSS_RAISE7,   new("BaronOfHell::raise",           6) },

        { ThingState.BOS2_STND,     new("HellKnight::spawn",            0) },
        { ThingState.BOS2_STND2,    new("HellKnight::spawn",            1) },
        { ThingState.BOS2_RUN1,     new("HellKnight::see",              0) },
        { ThingState.BOS2_RUN2,     new("HellKnight::see",              1) },
        { ThingState.BOS2_RUN3,     new("HellKnight::see",              2) },
        { ThingState.BOS2_RUN4,     new("HellKnight::see",              3) },
        { ThingState.BOS2_RUN5,     new("HellKnight::see",              4) },
        { ThingState.BOS2_RUN6,     new("HellKnight::see",              5) },
        { ThingState.BOS2_RUN7,     new("HellKnight::see",              6) },
        { ThingState.BOS2_RUN8,     new("HellKnight::see",              7) },
        { ThingState.BOS2_ATK1,     new("HellKnight::missile",          0) },
        { ThingState.BOS2_ATK2,     new("HellKnight::missile",          1) },
        { ThingState.BOS2_ATK3,     new("HellKnight::missile",          2) },
        { ThingState.BOS2_PAIN,     new("HellKnight::pain",             0) },
        { ThingState.BOS2_PAIN2,    new("HellKnight::pain",             1) },
        { ThingState.BOS2_DIE1,     new("HellKnight::death",            0) },
        { ThingState.BOS2_DIE2,     new("HellKnight::death",            1) },
        { ThingState.BOS2_DIE3,     new("HellKnight::death",            2) },
        { ThingState.BOS2_DIE4,     new("HellKnight::death",            3) },
        { ThingState.BOS2_DIE5,     new("HellKnight::death",            4) },
        { ThingState.BOS2_DIE6,     new("HellKnight::death",            5) },
        { ThingState.BOS2_DIE7,     new("HellKnight::death",            6) },
        { ThingState.BOS2_RAISE1,   new("HellKnight::raise",            0) },
        { ThingState.BOS2_RAISE2,   new("HellKnight::raise",            1) },
        { ThingState.BOS2_RAISE3,   new("HellKnight::raise",            2) },
        { ThingState.BOS2_RAISE4,   new("HellKnight::raise",            3) },
        { ThingState.BOS2_RAISE5,   new("HellKnight::raise",            4) },
        { ThingState.BOS2_RAISE6,   new("HellKnight::raise",            5) },
        { ThingState.BOS2_RAISE7,   new("HellKnight::raise",            6) },

        { ThingState.SKULL_STND,     new("LostSoul::spawn",             0) },
        { ThingState.SKULL_STND2,    new("LostSoul::spawn",             1) },
        { ThingState.SKULL_RUN1,     new("LostSoul::see",               0) },
        { ThingState.SKULL_RUN2,     new("LostSoul::see",               1) },
        { ThingState.SKULL_ATK1,     new("LostSoul::missile",           0) },
        { ThingState.SKULL_ATK2,     new("LostSoul::missile",           1) },
        { ThingState.SKULL_ATK3,     new("LostSoul::missile",           2) },
        { ThingState.SKULL_ATK4,     new("LostSoul::missile",           3) },
        { ThingState.SKULL_PAIN,     new("LostSoul::pain",              0) },
        { ThingState.SKULL_PAIN2,    new("LostSoul::pain",              1) },
        { ThingState.SKULL_DIE1,     new("LostSoul::death",             0) },
        { ThingState.SKULL_DIE2,     new("LostSoul::death",             1) },
        { ThingState.SKULL_DIE3,     new("LostSoul::death",             2) },
        { ThingState.SKULL_DIE4,     new("LostSoul::death",             3) },
        { ThingState.SKULL_DIE5,     new("LostSoul::death",             4) },
        { ThingState.SKULL_DIE6,     new("LostSoul::death",             5) },

        { ThingState.SPID_STND,     new("SpiderMastermind::spawn",      0) },
        { ThingState.SPID_STND2,    new("SpiderMastermind::spawn",      1) },
        { ThingState.SPID_RUN1,     new("SpiderMastermind::see",        0) },
        { ThingState.SPID_RUN2,     new("SpiderMastermind::see",        1) },
        { ThingState.SPID_RUN3,     new("SpiderMastermind::see",        2) },
        { ThingState.SPID_RUN4,     new("SpiderMastermind::see",        3) },
        { ThingState.SPID_RUN5,     new("SpiderMastermind::see",        4) },
        { ThingState.SPID_RUN6,     new("SpiderMastermind::see",        5) },
        { ThingState.SPID_RUN7,     new("SpiderMastermind::see",        6) },
        { ThingState.SPID_RUN8,     new("SpiderMastermind::see",        7) },
        { ThingState.SPID_RUN9,     new("SpiderMastermind::see",        8) },
        { ThingState.SPID_RUN10,    new("SpiderMastermind::see",        9) },
        { ThingState.SPID_RUN11,    new("SpiderMastermind::see",        10) },
        { ThingState.SPID_RUN12,    new("SpiderMastermind::see",        11) },
        { ThingState.SPID_ATK1,     new("SpiderMastermind::missile",    0) },
        { ThingState.SPID_ATK2,     new("SpiderMastermind::missile",    1) },
        { ThingState.SPID_ATK3,     new("SpiderMastermind::missile",    2) },
        { ThingState.SPID_ATK4,     new("SpiderMastermind::missile",    3) },
        { ThingState.SPID_PAIN,     new("SpiderMastermind::pain",       0) },
        { ThingState.SPID_PAIN2,    new("SpiderMastermind::pain",       1) },
        { ThingState.SPID_DIE1,     new("SpiderMastermind::death",      0) },
        { ThingState.SPID_DIE2,     new("SpiderMastermind::death",      1) },
        { ThingState.SPID_DIE3,     new("SpiderMastermind::death",      2) },
        { ThingState.SPID_DIE4,     new("SpiderMastermind::death",      3) },
        { ThingState.SPID_DIE5,     new("SpiderMastermind::death",      4) },
        { ThingState.SPID_DIE6,     new("SpiderMastermind::death",      5) },
        { ThingState.SPID_DIE7,     new("SpiderMastermind::death",      6) },
        { ThingState.SPID_DIE8,     new("SpiderMastermind::death",      7) },
        { ThingState.SPID_DIE9,     new("SpiderMastermind::death",      8) },
        { ThingState.SPID_DIE10,    new("SpiderMastermind::death",      9) },
        { ThingState.SPID_DIE11,    new("SpiderMastermind::death",      10) },

        { ThingState.BSPI_STND,     new("Arachnotron::spawn",           0) },
        { ThingState.BSPI_STND2,    new("Arachnotron::spawn",           1) },
        { ThingState.BSPI_SIGHT,    new("Arachnotron::see",             0) },
        { ThingState.BSPI_RUN1,     new("Arachnotron::see",             0) },
        { ThingState.BSPI_RUN2,     new("Arachnotron::see",             1) },
        { ThingState.BSPI_RUN3,     new("Arachnotron::see",             2) },
        { ThingState.BSPI_RUN4,     new("Arachnotron::see",             3) },
        { ThingState.BSPI_RUN5,     new("Arachnotron::see",             4) },
        { ThingState.BSPI_RUN6,     new("Arachnotron::see",             5) },
        { ThingState.BSPI_RUN7,     new("Arachnotron::see",             6) },
        { ThingState.BSPI_RUN8,     new("Arachnotron::see",             7) },
        { ThingState.BSPI_RUN9,     new("Arachnotron::see",             8) },
        { ThingState.BSPI_RUN10,    new("Arachnotron::see",             9) },
        { ThingState.BSPI_RUN11,    new("Arachnotron::see",             10) },
        { ThingState.BSPI_RUN12,    new("Arachnotron::see",             11) },
        { ThingState.BSPI_ATK1,     new("Arachnotron::missile",         0) },
        { ThingState.BSPI_ATK2,     new("Arachnotron::missile",         1) },
        { ThingState.BSPI_ATK3,     new("Arachnotron::missile",         2) },
        { ThingState.BSPI_ATK4,     new("Arachnotron::missile",         3) },
        { ThingState.BSPI_PAIN,     new("Arachnotron::pain",            0) },
        { ThingState.BSPI_PAIN2,    new("Arachnotron::pain",            1) },
        { ThingState.BSPI_DIE1,     new("Arachnotron::death",           0) },
        { ThingState.BSPI_DIE2,     new("Arachnotron::death",           1) },
        { ThingState.BSPI_DIE3,     new("Arachnotron::death",           2) },
        { ThingState.BSPI_DIE4,     new("Arachnotron::death",           3) },
        { ThingState.BSPI_DIE5,     new("Arachnotron::death",           4) },
        { ThingState.BSPI_DIE6,     new("Arachnotron::death",           5) },
        { ThingState.BSPI_DIE7,     new("Arachnotron::death",           6) },
        { ThingState.BSPI_RAISE1,   new("Arachnotron::raise",           0) },
        { ThingState.BSPI_RAISE2,   new("Arachnotron::raise",           1) },
        { ThingState.BSPI_RAISE3,   new("Arachnotron::raise",           2) },
        { ThingState.BSPI_RAISE4,   new("Arachnotron::raise",           3) },
        { ThingState.BSPI_RAISE5,   new("Arachnotron::raise",           4) },
        { ThingState.BSPI_RAISE6,   new("Arachnotron::raise",           5) },
        { ThingState.BSPI_RAISE7,   new("Arachnotron::raise",           6) },

        { ThingState.ARACH_PLAZ,    new("ArachnotronPlasma::spawn",     0) },
        { ThingState.ARACH_PLAZ2,   new("ArachnotronPlasma::spawn",     1) },
        { ThingState.ARACH_PLEX,    new("ArachnotronPlasma::death",     0) },
        { ThingState.ARACH_PLEX2,   new("ArachnotronPlasma::death",     1) },
        { ThingState.ARACH_PLEX3,   new("ArachnotronPlasma::death",     2) },
        { ThingState.ARACH_PLEX4,   new("ArachnotronPlasma::death",     3) },
        { ThingState.ARACH_PLEX5,   new("ArachnotronPlasma::death",     4) },

        { ThingState.CYBER_STND,    new("Cyberdemon::spawn",            0) },
        { ThingState.CYBER_STND2,   new("Cyberdemon::spawn",            1) },
        { ThingState.CYBER_RUN1,    new("Cyberdemon::see",              0) },
        { ThingState.CYBER_RUN2,    new("Cyberdemon::see",              1) },
        { ThingState.CYBER_RUN3,    new("Cyberdemon::see",              2) },
        { ThingState.CYBER_RUN4,    new("Cyberdemon::see",              3) },
        { ThingState.CYBER_RUN5,    new("Cyberdemon::see",              4) },
        { ThingState.CYBER_RUN6,    new("Cyberdemon::see",              5) },
        { ThingState.CYBER_RUN7,    new("Cyberdemon::see",              6) },
        { ThingState.CYBER_RUN8,    new("Cyberdemon::see",              7) },
        { ThingState.CYBER_ATK1,    new("Cyberdemon::missile",          0) },
        { ThingState.CYBER_ATK2,    new("Cyberdemon::missile",          1) },
        { ThingState.CYBER_ATK3,    new("Cyberdemon::missile",          2) },
        { ThingState.CYBER_ATK4,    new("Cyberdemon::missile",          3) },
        { ThingState.CYBER_ATK5,    new("Cyberdemon::missile",          4) },
        { ThingState.CYBER_ATK6,    new("Cyberdemon::missile",          5) },
        { ThingState.CYBER_PAIN,    new("Cyberdemon::pain",             0) },
        { ThingState.CYBER_DIE1,    new("Cyberdemon::death",            0) },
        { ThingState.CYBER_DIE2,    new("Cyberdemon::death",            1) },
        { ThingState.CYBER_DIE3,    new("Cyberdemon::death",            2) },
        { ThingState.CYBER_DIE4,    new("Cyberdemon::death",            3) },
        { ThingState.CYBER_DIE5,    new("Cyberdemon::death",            4) },
        { ThingState.CYBER_DIE6,    new("Cyberdemon::death",            5) },
        { ThingState.CYBER_DIE7,    new("Cyberdemon::death",            6) },
        { ThingState.CYBER_DIE8,    new("Cyberdemon::death",            7) },
        { ThingState.CYBER_DIE9,    new("Cyberdemon::death",            8) },
        { ThingState.CYBER_DIE10,   new("Cyberdemon::death",            9) },

        { ThingState.PAIN_STND,     new("PainElemental::spawn",         0) },
        { ThingState.PAIN_RUN1,     new("PainElemental::see",           0) },
        { ThingState.PAIN_RUN2,     new("PainElemental::see",           1) },
        { ThingState.PAIN_RUN3,     new("PainElemental::see",           2) },
        { ThingState.PAIN_RUN4,     new("PainElemental::see",           3) },
        { ThingState.PAIN_RUN5,     new("PainElemental::see",           4) },
        { ThingState.PAIN_RUN6,     new("PainElemental::see",           5) },
        { ThingState.PAIN_ATK1,     new("PainElemental::missile",       0) },
        { ThingState.PAIN_ATK2,     new("PainElemental::missile",       1) },
        { ThingState.PAIN_ATK3,     new("PainElemental::missile",       2) },
        { ThingState.PAIN_ATK4,     new("PainElemental::missile",       3) },
        { ThingState.PAIN_PAIN,     new("PainElemental::pain",          0) },
        { ThingState.PAIN_PAIN2,    new("PainElemental::pain",          1) },
        { ThingState.PAIN_DIE1,     new("PainElemental::death",         0) },
        { ThingState.PAIN_DIE2,     new("PainElemental::death",         1) },
        { ThingState.PAIN_DIE3,     new("PainElemental::death",         2) },
        { ThingState.PAIN_DIE4,     new("PainElemental::death",         3) },
        { ThingState.PAIN_DIE5,     new("PainElemental::death",         4) },
        { ThingState.PAIN_DIE6,     new("PainElemental::death",         5) },
        { ThingState.PAIN_RAISE1,   new("PainElemental::raise",         0) },
        { ThingState.PAIN_RAISE2,   new("PainElemental::raise",         1) },
        { ThingState.PAIN_RAISE3,   new("PainElemental::raise",         2) },
        { ThingState.PAIN_RAISE4,   new("PainElemental::raise",         3) },
        { ThingState.PAIN_RAISE5,   new("PainElemental::raise",         4) },
        { ThingState.PAIN_RAISE6,   new("PainElemental::raise",         5) },

        { ThingState.SSWV_STND,     new("WolfensteinSS::spawn",         0) },
        { ThingState.SSWV_STND2,    new("WolfensteinSS::spawn",         1) },
        { ThingState.SSWV_RUN1,     new("WolfensteinSS::see",           0) },
        { ThingState.SSWV_RUN2,     new("WolfensteinSS::see",           1) },
        { ThingState.SSWV_RUN3,     new("WolfensteinSS::see",           2) },
        { ThingState.SSWV_RUN4,     new("WolfensteinSS::see",           3) },
        { ThingState.SSWV_RUN5,     new("WolfensteinSS::see",           4) },
        { ThingState.SSWV_RUN6,     new("WolfensteinSS::see",           5) },
        { ThingState.SSWV_RUN7,     new("WolfensteinSS::see",           6) },
        { ThingState.SSWV_RUN8,     new("WolfensteinSS::see",           7) },
        { ThingState.SSWV_ATK1,     new("WolfensteinSS::missile",       0) },
        { ThingState.SSWV_ATK2,     new("WolfensteinSS::missile",       1) },
        { ThingState.SSWV_ATK3,     new("WolfensteinSS::missile",       2) },
        { ThingState.SSWV_ATK4,     new("WolfensteinSS::missile",       3) },
        { ThingState.SSWV_ATK5,     new("WolfensteinSS::missile",       4) },
        { ThingState.SSWV_ATK6,     new("WolfensteinSS::missile",       5) },
        { ThingState.SSWV_PAIN,     new("WolfensteinSS::pain",          0) },
        { ThingState.SSWV_PAIN2,    new("WolfensteinSS::pain",          1) },
        { ThingState.SSWV_DIE1,     new("WolfensteinSS::death",         0) },
        { ThingState.SSWV_DIE2,     new("WolfensteinSS::death",         1) },
        { ThingState.SSWV_DIE3,     new("WolfensteinSS::death",         2) },
        { ThingState.SSWV_DIE4,     new("WolfensteinSS::death",         3) },
        { ThingState.SSWV_DIE5,     new("WolfensteinSS::death",         4) },
        { ThingState.SSWV_XDIE1,    new("WolfensteinSS::xdeath",        0) },
        { ThingState.SSWV_XDIE2,    new("WolfensteinSS::xdeath",        1) },
        { ThingState.SSWV_XDIE3,    new("WolfensteinSS::xdeath",        2) },
        { ThingState.SSWV_XDIE4,    new("WolfensteinSS::xdeath",        3) },
        { ThingState.SSWV_XDIE5,    new("WolfensteinSS::xdeath",        4) },
        { ThingState.SSWV_XDIE6,    new("WolfensteinSS::xdeath",        5) },
        { ThingState.SSWV_XDIE7,    new("WolfensteinSS::xdeath",        6) },
        { ThingState.SSWV_XDIE8,    new("WolfensteinSS::xdeath",        7) },
        { ThingState.SSWV_XDIE9,    new("WolfensteinSS::xdeath",        8) },
        { ThingState.SSWV_RAISE1,   new("WolfensteinSS::raise",         0) },
        { ThingState.SSWV_RAISE2,   new("WolfensteinSS::raise",         1) },
        { ThingState.SSWV_RAISE3,   new("WolfensteinSS::raise",         2) },
        { ThingState.SSWV_RAISE4,   new("WolfensteinSS::raise",         3) },
        { ThingState.SSWV_RAISE5,   new("WolfensteinSS::raise",         4) },

        { ThingState.KEENSTND,      new("CommanderKeen::spawn",         0) },
        { ThingState.COMMKEEN,      new("CommanderKeen::death",         0) },
        { ThingState.COMMKEEN2,     new("CommanderKeen::death",         1) },
        { ThingState.COMMKEEN3,     new("CommanderKeen::death",         2) },
        { ThingState.COMMKEEN4,     new("CommanderKeen::death",         3) },
        { ThingState.COMMKEEN5,     new("CommanderKeen::death",         4) },
        { ThingState.COMMKEEN6,     new("CommanderKeen::death",         5) },
        { ThingState.COMMKEEN7,     new("CommanderKeen::death",         6) },
        { ThingState.COMMKEEN8,     new("CommanderKeen::death",         7) },
        { ThingState.COMMKEEN9,     new("CommanderKeen::death",         8) },
        { ThingState.COMMKEEN10,    new("CommanderKeen::death",         9) },
        { ThingState.COMMKEEN11,    new("CommanderKeen::death",         10) },
        { ThingState.COMMKEEN12,    new("CommanderKeen::death",         11) },
        { ThingState.KEENPAIN,      new("CommanderKeen::pain",          0) },
        { ThingState.KEENPAIN2,     new("CommanderKeen::pain",          1) },

        { ThingState.BRAIN,         new("BossBrain::spawn",             0) },
        { ThingState.BRAIN_PAIN,    new("BossBrain::pain",              0) },
        { ThingState.BRAIN_DIE1,    new("BossBrain::death",             0) },
        { ThingState.BRAIN_DIE2,    new("BossBrain::death",             1) },
        { ThingState.BRAIN_DIE3,    new("BossBrain::death",             2) },
        { ThingState.BRAIN_DIE4,    new("BossBrain::death",             3) },

        { ThingState.BRAINEYE,      new("BossEye::spawn",               0) },
        { ThingState.BRAINEYESEE,   new("BossEye::see",                 0) },
        { ThingState.BRAINEYE1,     new("BossEye::see",                 1) },

        { ThingState.SPAWN1,        new("SpawnShot::spawn",             0) },
        { ThingState.SPAWN2,        new("SpawnShot::spawn",             1) },
        { ThingState.SPAWN3,        new("SpawnShot::spawn",             2) },
        { ThingState.SPAWN4,        new("SpawnShot::spawn",             3) },

        { ThingState.SPAWNFIRE1,    new("SpawnFire::spawn",               0) },
        { ThingState.SPAWNFIRE2,    new("SpawnFire::spawn",               1) },
        { ThingState.SPAWNFIRE3,    new("SpawnFire::spawn",               2) },
        { ThingState.SPAWNFIRE4,    new("SpawnFire::spawn",               3) },
        { ThingState.SPAWNFIRE5,    new("SpawnFire::spawn",               4) },
        { ThingState.SPAWNFIRE6,    new("SpawnFire::spawn",               5) },
        { ThingState.SPAWNFIRE7,    new("SpawnFire::spawn",               6) },
        { ThingState.SPAWNFIRE8,    new("SpawnFire::spawn",               7) },

        { ThingState.BRAINEXPLODE1, new("BossRocket::spawn",            0) },
        { ThingState.BRAINEXPLODE2, new("BossRocket::spawn",            1) },
        { ThingState.BRAINEXPLODE3, new("BossRocket::spawn",            2) },

        { ThingState.ARM1,          new("GreenArmor::spawn",            0) },
        { ThingState.ARM1A,         new("GreenArmor::spawn",            1) },

        { ThingState.ARM2,          new("BlueArmor::spawn",             0) },
        { ThingState.ARM2A,         new("BlueArmor::spawn",             1) },

        { ThingState.BAR1,          new("ExplosiveBarrel::spawn",       0) },
        { ThingState.BAR2,          new("ExplosiveBarrel::spawn",       1) },
        { ThingState.BEXP,          new("ExplosiveBarrel::death",       0) },
        { ThingState.BEXP2,         new("ExplosiveBarrel::death",       1) },
        { ThingState.BEXP3,         new("ExplosiveBarrel::death",       2) },
        { ThingState.BEXP4,         new("ExplosiveBarrel::death",       3) },
        { ThingState.BEXP5,         new("ExplosiveBarrel::death",       5) },

        { ThingState.BBAR1,         new("BurningBarrel::spawn",         0) },
        { ThingState.BBAR2,         new("BurningBarrel::spawn",         1) },
        { ThingState.BBAR3,         new("BurningBarrel::spawn",         2) },

        { ThingState.BON1,          new("HealthBonus::spawn",           0) },
        { ThingState.BON1A,         new("HealthBonus::spawn",           1) },
        { ThingState.BON1B,         new("HealthBonus::spawn",           2) },
        { ThingState.BON1C,         new("HealthBonus::spawn",           3) },
        { ThingState.BON1D,         new("HealthBonus::spawn",           4) },
        { ThingState.BON1E,         new("HealthBonus::spawn",           5) },

        { ThingState.BON2,          new("ArmorBonus::spawn",            0) },
        { ThingState.BON2A,         new("ArmorBonus::spawn",            1) },
        { ThingState.BON2B,         new("ArmorBonus::spawn",            2) },
        { ThingState.BON2C,         new("ArmorBonus::spawn",            3) },
        { ThingState.BON2D,         new("ArmorBonus::spawn",            4) },
        { ThingState.BON2E,         new("ArmorBonus::spawn",            5) },

        { ThingState.BKEY,          new("BlueCard::spawn",              0) },
        { ThingState.BKEY2,         new("BlueCard::spawn",              1) },

        { ThingState.RKEY,          new("RedCard::spawn",               0) },
        { ThingState.RKEY2,         new("RedCard::spawn",               1) },

        { ThingState.YKEY,          new("YellowCard::spawn",            0) },
        { ThingState.YKEY2,         new("YellowCard::spawn",            1) },

        { ThingState.BSKULL,        new("BlueSkull::spawn",             0) },
        { ThingState.BSKULL2,       new("BlueSkull::spawn",             1) },

        { ThingState.RSKULL,        new("RedSkull::spawn",              0) },
        { ThingState.RSKULL2,       new("RedSkull::spawn",              1) },

        { ThingState.YSKULL,        new("YellowSkull::spawn",           0) },
        { ThingState.YSKULL2,       new("YellowSkull::spawn",           1) },

        { ThingState.STIM,          new("Stimpack::spawn",              0) },
        { ThingState.MEDI,          new("Stimpack::spawn",              0) },

        { ThingState.SOUL,          new("Soulsphere::spawn",            0) },
        { ThingState.SOUL2,         new("Soulsphere::spawn",            1) },
        { ThingState.SOUL3,         new("Soulsphere::spawn",            2) },
        { ThingState.SOUL4,         new("Soulsphere::spawn",            3) },
        { ThingState.SOUL5,         new("Soulsphere::spawn",            4) },
        { ThingState.SOUL6,         new("Soulsphere::spawn",            5) },

        { ThingState.PINV,          new("InvulnerabilitySphere::spawn", 0) },
        { ThingState.PINV2,         new("InvulnerabilitySphere::spawn", 1) },
        { ThingState.PINV3,         new("InvulnerabilitySphere::spawn", 2) },
        { ThingState.PINV4,         new("InvulnerabilitySphere::spawn", 3) },

        { ThingState.PSTR,          new("Berserk::spawn",               0) },

        { ThingState.PINS,          new("BlurSphere::spawn",            0) },
        { ThingState.PINS2,         new("BlurSphere::spawn",            1) },
        { ThingState.PINS3,         new("BlurSphere::spawn",            2) },
        { ThingState.PINS4,         new("BlurSphere::spawn",            3) },

        { ThingState.MEGA,          new("Megasphere::spawn",            0) },
        { ThingState.MEGA2,         new("Megasphere::spawn",            1) },
        { ThingState.MEGA3,         new("Megasphere::spawn",            2) },
        { ThingState.MEGA4,         new("Megasphere::spawn",            3) },

        { ThingState.SUIT,          new("RadSuit::spawn",               0) },

        { ThingState.PMAP,          new("Allmap::spawn",                0) },
        { ThingState.PMAP2,         new("Allmap::spawn",                1) },
        { ThingState.PMAP3,         new("Allmap::spawn",                2) },
        { ThingState.PMAP4,         new("Allmap::spawn",                3) },
        { ThingState.PMAP5,         new("Allmap::spawn",                4) },
        { ThingState.PMAP6,         new("Allmap::spawn",                5) },

        { ThingState.PVIS,          new("Infrared::spawn",              0) },
        { ThingState.PVIS2,         new("Infrared::spawn",              1) },

        { ThingState.CLIP,          new("Clip::spawn",                  0) },
        { ThingState.AMMO,          new("ClipBox::spawn",               0) },
        { ThingState.ROCK,          new("RocketAmmo::spawn",            0) },
        { ThingState.BROK,          new("RocketBox::spawn",             0) },
        { ThingState.CELL,          new("Cell::spawn",                  0) },
        { ThingState.CELP,          new("CellPack::spawn",              0) },
        { ThingState.SHEL,          new("Shell::spawn",                 0) },
        { ThingState.SBOX,          new("ShellBox::spawn",              0) },
        { ThingState.BPAK,          new("Backpack::spawn",              0) },

        { ThingState.BFUG,          new("BFG9000::spawn",               0) },
        { ThingState.MGUN,          new("Chaingun::spawn",              0) },
        { ThingState.CSAW,          new("Chainsaw::spawn",              0) },
        { ThingState.LAUN,          new("RocketLauncher::spawn",        0) },
        { ThingState.PLAS,          new("PlasmaRifle::spawn",           0) },
        { ThingState.SHOT,          new("Shotgun::spawn",               0) },
        { ThingState.SHOT2,         new("SuperShotgun::spawn",          0) },

        { ThingState.COLU,          new("Column::spawn",                0) },
        { ThingState.STALAG,        new("Stalagmite::spawn",            0) },

        { ThingState.BLOODYTWITCH,  new("BloodyTwitch::spawn",          0) },
        { ThingState.BLOODYTWITCH2, new("BloodyTwitch::spawn",          1) },
        { ThingState.BLOODYTWITCH3, new("BloodyTwitch::spawn",          2) },
        { ThingState.BLOODYTWITCH4, new("BloodyTwitch::spawn",          3) },

        { ThingState.DEADTORSO,     new("DeadTorso::spawn",           0) },
        { ThingState.DEADBOTTOM,    new("GibbedMarine::spawn",          0) },
        { ThingState.HEADSONSTICK,  new("HeadsOnAStick::spawn",         0) },
        { ThingState.GIBS,          new("Actor::GenericCrush",          0) }, // TODO verify
        { ThingState.HEADONASTICK,  new("HeadOnAStick::spawn",          0) },
        { ThingState.HEADCANDLES,   new("HeadCandles::spawn",           0) },
        { ThingState.HEADCANDLES2,  new("HeadCandles::spawn",           1) },
        { ThingState.DEADSTICK,     new("DeadStick::spawn",             0) },
        { ThingState.LIVESTICK,     new("LiveStick::spawn",             0) },
        { ThingState.LIVESTICK2,    new("LiveStick::spawn",             1) },
        { ThingState.MEAT2,         new("Meat2::spawn",                 0) },
        { ThingState.MEAT3,         new("Meat3::spawn",                 0) },
        { ThingState.MEAT4,         new("Meat4::spawn",                 0) },
        { ThingState.MEAT5,         new("Meat5::spawn",                 0) },
        { ThingState.STALAGTITE,    new("Stalagtite::spawn",            0) },
        { ThingState.TALLGRNCOL,    new("TallGreenColumn::spawn",       0) },
        { ThingState.SHRTGRNCOL,    new("ShortGreenColumn::spawn",      0) },
        { ThingState.TALLREDCOL,    new("TallRedColumn::spawn",         0) },
        { ThingState.SHRTREDCOL,    new("ShortRedColumn::spawn",        0) },
        { ThingState.CANDLESTIK,    new("Candlestick::spawn",           0) },
        { ThingState.CANDELABRA,    new("Candelabra::spawn",            0) },
        { ThingState.SKULLCOL,      new("SkullColumn::spawn",           0) },
        { ThingState.TORCHTREE,     new("TorchTree::spawn",             0) },
        { ThingState.BIGTREE,       new("BigTree::spawn",               0) },
        { ThingState.TECHPILLAR,    new("TechPillar::spawn",            0) },
        { ThingState.EVILEYE,       new("EvilEye::spawn",               0) },
        { ThingState.EVILEYE2,      new("EvilEye::spawn",               1) },
        { ThingState.EVILEYE3,      new("EvilEye::spawn",               2) },
        { ThingState.EVILEYE4,      new("EvilEye::spawn",               3) },
        { ThingState.FLOATSKULL,    new("FloatingSkull::spawn",         0) },
        { ThingState.FLOATSKULL2,   new("FloatingSkull::spawn",         1) },
        { ThingState.FLOATSKULL3,   new("FloatingSkull::spawn",         2) },
        { ThingState.HEARTCOL,      new("HeartColumn::spawn",           0) },
        { ThingState.HEARTCOL2,     new("HeartColumn::spawn",           1) },
        { ThingState.BLUETORCH,     new("BlueTorch::spawn",             0) },
        { ThingState.BLUETORCH2,    new("BlueTorch::spawn",             1) },
        { ThingState.BLUETORCH3,    new("BlueTorch::spawn",             2) },
        { ThingState.BLUETORCH4,    new("BlueTorch::spawn",             3) },
        { ThingState.GREENTORCH,    new("GreenTorch::spawn",            0) },
        { ThingState.GREENTORCH2,   new("GreenTorch::spawn",            1) },
        { ThingState.GREENTORCH3,   new("GreenTorch::spawn",            2) },
        { ThingState.GREENTORCH4,   new("GreenTorch::spawn",            3) },
        { ThingState.REDTORCH,      new("RedTorch::spawn",              0) },
        { ThingState.REDTORCH2,     new("RedTorch::spawn",              1) },
        { ThingState.REDTORCH3,     new("RedTorch::spawn",              2) },
        { ThingState.REDTORCH4,     new("RedTorch::spawn",              3) },
        { ThingState.BTORCHSHRT,    new("ShortBlueTorch::spawn",        0) },
        { ThingState.BTORCHSHRT2,   new("ShortBlueTorch::spawn",        1) },
        { ThingState.BTORCHSHRT3,   new("ShortBlueTorch::spawn",        2) },
        { ThingState.BTORCHSHRT4,   new("ShortBlueTorch::spawn",        3) },
        { ThingState.GTORCHSHRT,    new("ShortGreenTorch::spawn",       0) },
        { ThingState.GTORCHSHRT2,   new("ShortGreenTorch::spawn",       1) },
        { ThingState.GTORCHSHRT3,   new("ShortGreenTorch::spawn",       2) },
        { ThingState.GTORCHSHRT4,   new("ShortGreenTorch::spawn",       3) },
        { ThingState.RTORCHSHRT,    new("ShortRedTorch::spawn",         0) },
        { ThingState.RTORCHSHRT2,   new("ShortRedTorch::spawn",         1) },
        { ThingState.RTORCHSHRT3,   new("ShortRedTorch::spawn",         2) },
        { ThingState.RTORCHSHRT4,   new("ShortRedTorch::spawn",         3) },
        { ThingState.HANGNOGUTS,    new("HangNoGuts::spawn",            0) },
        { ThingState.HANGBNOBRAIN,  new("HangBNoBrain::spawn",          0) },
        { ThingState.HANGTLOOKDN,   new("HangTLookingDown::spawn",      0) },
        { ThingState.HANGTSKULL,    new("HangTSkull::spawn",            0) },
        { ThingState.HANGTLOOKUP,   new("HangTLookingUp::spawn",        0) },
        { ThingState.HANGTNOBRAIN,  new("HangTNoBrain::spawn",          0) },
        { ThingState.COLONGIBS,     new("ColonGibs::spawn",             0) },
        { ThingState.SMALLPOOL,     new("SmallBloodPool::spawn",        0) },
        { ThingState.BRAINSTEM,     new("BrainStem::spawn",             0) },
        { ThingState.TECHLAMP,      new("TechLamp::spawn",              0) },
        { ThingState.TECHLAMP2,     new("TechLamp::spawn",              1) },
        { ThingState.TECHLAMP3,     new("TechLamp::spawn",              2) },
        { ThingState.TECHLAMP4,     new("TechLamp::spawn",              3) },
        { ThingState.TECH2LAMP,     new("TechLamp2::spawn",             0) },
        { ThingState.TECH2LAMP2,    new("TechLamp2::spawn",             1) },
        { ThingState.TECH2LAMP3,    new("TechLamp2::spawn",             2) },
        { ThingState.TECH2LAMP4,    new("TechLamp2::spawn",             3) },

        { ThingState.TNT1,          new("Actor::null",                  0) },

        { ThingState.GRENADE,       new("Grenade::Grenade",             0) },

        { ThingState.DETONATE,      new("Grenade::Detonate",            0) },
        { ThingState.DETONATE2,     new("Grenade::Detonate",            1) },
        { ThingState.DETONATE3,     new("Grenade::Detonate",            2) },

        { ThingState.DOGS_STND,     new("MBFHelperDog::spawn",          0) },
        { ThingState.DOGS_STND2,    new("MBFHelperDog::spawn",          1) },
        { ThingState.DOGS_RUN1,     new("MBFHelperDog::see",            0) },
        { ThingState.DOGS_RUN2,     new("MBFHelperDog::see",            1) },
        { ThingState.DOGS_RUN3,     new("MBFHelperDog::see",            2) },
        { ThingState.DOGS_RUN4,     new("MBFHelperDog::see",            3) },
        { ThingState.DOGS_RUN5,     new("MBFHelperDog::see",            4) },
        { ThingState.DOGS_RUN6,     new("MBFHelperDog::see",            5) },
        { ThingState.DOGS_RUN7,     new("MBFHelperDog::see",            6) },
        { ThingState.DOGS_RUN8,     new("MBFHelperDog::see",            7) },
        { ThingState.DOGS_ATK1,     new("MBFHelperDog::melee",          0) },
        { ThingState.DOGS_ATK2,     new("MBFHelperDog::melee",          1) },
        { ThingState.DOGS_ATK3,     new("MBFHelperDog::melee",          2) },
        { ThingState.DOGS_PAIN,     new("MBFHelperDog::pain",           0) },
        { ThingState.DOGS_PAIN2,    new("MBFHelperDog::pain",           1) },
        { ThingState.DOGS_DIE1,     new("MBFHelperDog::death",          0) },
        { ThingState.DOGS_DIE2,     new("MBFHelperDog::death",          1) },
        { ThingState.DOGS_DIE3,     new("MBFHelperDog::death",          2) },
        { ThingState.DOGS_DIE4,     new("MBFHelperDog::death",          3) },
        { ThingState.DOGS_DIE5,     new("MBFHelperDog::death",          4) },
        { ThingState.DOGS_RAISE1,   new("MBFHelperDog::raise",          0) },
        { ThingState.DOGS_RAISE2,   new("MBFHelperDog::raise",          1) },
        { ThingState.DOGS_RAISE3,   new("MBFHelperDog::raise",          2) },
        { ThingState.DOGS_RAISE4,   new("MBFHelperDog::raise",          3) },
        { ThingState.DOGS_RAISE5,   new("MBFHelperDog::raise",          4) },
        { ThingState.DOGS_RAISE6,   new("MBFHelperDog::raise",          5) },

        { ThingState.OLDBFG1,       new("BFG9000::OldFire",             0) },
        { ThingState.OLDBFG2,       new("BFG9000::OldFire",             1) },
        { ThingState.OLDBFG3,       new("BFG9000::OldFire",             2) },
        { ThingState.OLDBFG4,       new("BFG9000::OldFire",             3) },
        { ThingState.OLDBFG5,       new("BFG9000::OldFire",             4) },
        { ThingState.OLDBFG6,       new("BFG9000::OldFire",             5) },
        { ThingState.OLDBFG7,       new("BFG9000::OldFire",             6) },
        { ThingState.OLDBFG8,       new("BFG9000::OldFire",             7) },
        { ThingState.OLDBFG9,       new("BFG9000::OldFire",             8) },
        { ThingState.OLDBFG10,      new("BFG9000::OldFire",             9) },
        { ThingState.OLDBFG11,      new("BFG9000::OldFire",             10) },
        { ThingState.OLDBFG12,      new("BFG9000::OldFire",             11) },
        { ThingState.OLDBFG13,      new("BFG9000::OldFire",             12) },
        { ThingState.OLDBFG14,      new("BFG9000::OldFire",             13) },
        { ThingState.OLDBFG15,      new("BFG9000::OldFire",             14) },
        { ThingState.OLDBFG16,      new("BFG9000::OldFire",             15) },
        { ThingState.OLDBFG17,      new("BFG9000::OldFire",             16) },
        { ThingState.OLDBFG18,      new("BFG9000::OldFire",             17) },
        { ThingState.OLDBFG19,      new("BFG9000::OldFire",             18) },
        { ThingState.OLDBFG20,      new("BFG9000::OldFire",             19) },
        { ThingState.OLDBFG21,      new("BFG9000::OldFire",             20) },
        { ThingState.OLDBFG22,      new("BFG9000::OldFire",             21) },
        { ThingState.OLDBFG23,      new("BFG9000::OldFire",             22) },
        { ThingState.OLDBFG24,      new("BFG9000::OldFire",             23) },
        { ThingState.OLDBFG25,      new("BFG9000::OldFire",             24) },
        { ThingState.OLDBFG26,      new("BFG9000::OldFire",             25) },
        { ThingState.OLDBFG27,      new("BFG9000::OldFire",             26) },
        { ThingState.OLDBFG28,      new("BFG9000::OldFire",             27) },
        { ThingState.OLDBFG29,      new("BFG9000::OldFire",             28) },
        { ThingState.OLDBFG30,      new("BFG9000::OldFire",             29) },
        { ThingState.OLDBFG31,      new("BFG9000::OldFire",             30) },
        { ThingState.OLDBFG32,      new("BFG9000::OldFire",             31) },
        { ThingState.OLDBFG33,      new("BFG9000::OldFire",             32) },
        { ThingState.OLDBFG34,      new("BFG9000::OldFire",             33) },
        { ThingState.OLDBFG35,      new("BFG9000::OldFire",             34) },
        { ThingState.OLDBFG36,      new("BFG9000::OldFire",             35) },
        { ThingState.OLDBFG37,      new("BFG9000::OldFire",             36) },
        { ThingState.OLDBFG38,      new("BFG9000::OldFire",             37) },
        { ThingState.OLDBFG39,      new("BFG9000::OldFire",             38) },
        { ThingState.OLDBFG40,      new("BFG9000::OldFire",             39) },
        { ThingState.OLDBFG41,      new("BFG9000::OldFire",             40) },
        { ThingState.OLDBFG42,      new("BFG9000::OldFire",             41) },
        { ThingState.OLDBFG43,      new("BFG9000::OldFire",             42) },

        { ThingState.PLS1BALL,      new("PlasmaBall1::Spawn",           0) },
        { ThingState.PLS1BALL2,     new("PlasmaBall1::Spawn",           1) },
        { ThingState.PLS1EXP,       new("PlasmaBall1::Death",           0) },
        { ThingState.PLS1EXP2,      new("PlasmaBall1::Death",           1) },
        { ThingState.PLS1EXP3,      new("PlasmaBall1::Death",           2) },
        { ThingState.PLS1EXP4,      new("PlasmaBall1::Death",           3) },

        { ThingState.PLS2BALL,      new("PlasmaBall2::Spawn",           0) },
        { ThingState.PLS2BALL2,     new("PlasmaBall2::Spawn",           1) },
        { ThingState.PLS2BALLX1,    new("PlasmaBall2::Death",           0) },
        { ThingState.PLS2BALLX2,    new("PlasmaBall2::Death",           1) },
        { ThingState.PLS2BALLX3,    new("PlasmaBall2::Death",           2) },

        { ThingState.BON3,          new("Actor::Spawn",                 0) },
        { ThingState.BON4,          new("Actor::Spawn",                 0) },

        { ThingState.BSKUL_STND,    new("BetaSkull::spawn",             0) },
        { ThingState.BSKUL_RUN1,    new("BetaSkull::see",               0) },
        { ThingState.BSKUL_RUN2,    new("BetaSkull::see",               1) },
        { ThingState.BSKUL_RUN3,    new("BetaSkull::see",               2) },
        { ThingState.BSKUL_RUN4,    new("BetaSkull::see",               3) },
        { ThingState.BSKUL_ATK1,    new("BetaSkull::missile",           0) },
        { ThingState.BSKUL_ATK2,    new("BetaSkull::missile",           1) },
        { ThingState.BSKUL_ATK3,    new("BetaSkull::missile",           2) },
        { ThingState.BSKUL_PAIN1,   new("BetaSkull::pain",              0) },
        { ThingState.BSKUL_PAIN2,   new("BetaSkull::pain",              1) },
        { ThingState.BSKUL_PAIN3,   new("BetaSkull::pain",              2) },
        { ThingState.BSKUL_DIE1,    new("BetaSkull::death",             0) },
        { ThingState.BSKUL_DIE2,    new("BetaSkull::death",             1) },
        { ThingState.BSKUL_DIE3,    new("BetaSkull::death",             2) },
        { ThingState.BSKUL_DIE4,    new("BetaSkull::death",             3) },
        { ThingState.BSKUL_DIE5,    new("BetaSkull::death",             4) },
        { ThingState.BSKUL_DIE6,    new("BetaSkull::death",             5) },
        { ThingState.BSKUL_DIE7,    new("BetaSkull::death",             6) },
        { ThingState.BSKUL_DIE8,    new("BetaSkull::death",             7) },

        { ThingState.MUSHROOM,      new("Grenade::Mushroom",            0) },
    };

    public readonly IReadOnlyDictionary<ThingState, string> ActionFunctionLookup = new Dictionary<ThingState, string>()
    {
        { ThingState.NULL, "NULL" },
        { ThingState.LIGHTDONE, "A_Light0" },

        { ThingState.PUNCH, "A_WeaponReady" },
        { ThingState.PUNCHDOWN, "A_Lower" },
        { ThingState.PUNCHUP, "A_Raise" },
        { ThingState.PUNCH2, "A_Punch" },
        { ThingState.PUNCH5, "A_ReFire" },

        { ThingState.PISTOL, "A_WeaponReady" },
        { ThingState.PISTOLDOWN, "A_Lower" },
        { ThingState.PISTOLUP, "A_Raise" },
        { ThingState.PISTOL2, "A_FirePistol" },
        { ThingState.PISTOL4, "A_ReFire" },
        { ThingState.PISTOLFLASH, "A_Light1" },

        { ThingState.SGUN, "A_WeaponReady" },
        { ThingState.SGUNDOWN, "A_Lower" },
        { ThingState.SGUNUP, "A_Raise" },
        { ThingState.SGUN2, "A_FireShotgun" },
        { ThingState.SGUN9, "A_ReFire" },
        { ThingState.SGUNFLASH1, "A_Light1" },
        { ThingState.SGUNFLASH2, "A_Light2" },

        { ThingState.DSGUN, "A_WeaponReady" },
        { ThingState.DSGUNDOWN, "A_Lower" },
        { ThingState.DSGUNUP, "A_Raise" },
        { ThingState.DSGUN2, "A_FireShotgun2" },
        { ThingState.DSGUN4, "A_CheckReload" },
        { ThingState.DSGUN5, "A_OpenShotgun2" },
        { ThingState.DSGUN7, "A_LoadShotgun2" },
        { ThingState.DSGUN9, "A_CloseShotgun2" },
        { ThingState.DSGUN10, "A_ReFire" },
        { ThingState.DSGUNFLASH1, "A_Light1" },
        { ThingState.DSGUNFLASH2, "A_Light2" },

        { ThingState.CHAIN, "A_WeaponReady" },
        { ThingState.CHAINDOWN, "A_Lower" },
        { ThingState.CHAINUP, "A_Raise" },
        { ThingState.CHAIN1, "A_FireCGun" },
        { ThingState.CHAIN2, "A_FireCGun" },
        { ThingState.CHAIN3, "A_ReFire" },
        { ThingState.CHAINFLASH1, "A_Light1" },
        { ThingState.CHAINFLASH2, "A_Light2" },

        { ThingState.MISSILE, "A_WeaponReady" },
        { ThingState.MISSILEDOWN, "A_Lower" },
        { ThingState.MISSILEUP, "A_Raise" },
        { ThingState.MISSILE1, "A_GunFlash" },
        { ThingState.MISSILE2, "A_FireMissile" },
        { ThingState.MISSILE3, "A_ReFire" },
        { ThingState.MISSILEFLASH1, "A_Light1" },
        { ThingState.MISSILEFLASH3, "A_Light2" },
        { ThingState.MISSILEFLASH4, "A_Light2" },

        { ThingState.SAW, "A_WeaponReady" },
        { ThingState.SAWB, "A_WeaponReady" },
        { ThingState.SAWDOWN, "A_Lower" },
        { ThingState.SAWUP, "A_Raise" },
        { ThingState.SAW1, "A_Saw" },
        { ThingState.SAW2, "A_Saw" },
        { ThingState.SAW3, "A_Saw" },

        { ThingState.PLASMA, "A_WeaponReady" },
        { ThingState.PLASMADOWN, "A_Lower" },
        { ThingState.PLASMAUP, "A_Raise" },
        { ThingState.PLASMA1, "A_FirePlasma" },
        { ThingState.PLASMA2, "A_ReFire" },
        { ThingState.PLASMAFLASH1, "A_Light1" },
        { ThingState.PLASMAFLASH2, "A_Light1" },

        { ThingState.BFG, "A_WeaponReady" },
        { ThingState.BFGDOWN, "A_Lower" },
        { ThingState.BFGUP, "A_Raise" },
        { ThingState.BFG1, "A_BFGsound" },
        { ThingState.BFG2, "A_GunFlash" },
        { ThingState.BFG3, "A_FireBFG" },
        { ThingState.BFG4, "A_ReFire" },
        { ThingState.BFGFLASH1, "A_Light1" },
        { ThingState.BFGFLASH2, "A_Light2" },

        { ThingState.BFGLAND3, "A_BFGSpray" },
        { ThingState.EXPLODE1, "A_Explode" },

        { ThingState.PLAY_PAIN2, "A_Pain" },
        { ThingState.PLAY_DIE2, "A_PlayerScream" },
        { ThingState.PLAY_DIE3, "A_Fall" },
        { ThingState.PLAY_XDIE2, "A_XScream" },
        { ThingState.PLAY_XDIE3, "A_Fall" },

        { ThingState.POSS_STND, "A_Look" },
        { ThingState.POSS_STND2, "A_Look" },
        { ThingState.POSS_RUN1, "A_Chase" },
        { ThingState.POSS_RUN2, "A_Chase" },
        { ThingState.POSS_RUN3, "A_Chase" },
        { ThingState.POSS_RUN4, "A_Chase" },
        { ThingState.POSS_RUN5, "A_Chase" },
        { ThingState.POSS_RUN6, "A_Chase" },
        { ThingState.POSS_RUN7, "A_Chase" },
        { ThingState.POSS_RUN8, "A_Chase" },
        { ThingState.POSS_ATK1, "A_FaceTarget" },
        { ThingState.POSS_ATK2, "A_PosAttack" },
        { ThingState.POSS_PAIN2, "A_Pain" },
        { ThingState.POSS_DIE2, "A_Scream" },
        { ThingState.POSS_DIE3, "A_Fall" },
        { ThingState.POSS_XDIE2, "A_XScream" },
        { ThingState.POSS_XDIE3, "A_Fall" },

        { ThingState.SPOS_STND, "A_Look" },
        { ThingState.SPOS_STND2, "A_Look" },
        { ThingState.SPOS_RUN1, "A_Chase" },
        { ThingState.SPOS_RUN2, "A_Chase" },
        { ThingState.SPOS_RUN3, "A_Chase" },
        { ThingState.SPOS_RUN4, "A_Chase" },
        { ThingState.SPOS_RUN5, "A_Chase" },
        { ThingState.SPOS_RUN6, "A_Chase" },
        { ThingState.SPOS_RUN7, "A_Chase" },
        { ThingState.SPOS_RUN8, "A_Chase" },
        { ThingState.SPOS_ATK1, "A_FaceTarget" },
        { ThingState.SPOS_ATK2, "A_SPosAttackUseAtkSound" },
        { ThingState.SPOS_PAIN2, "A_Pain" },
        { ThingState.SPOS_DIE2, "A_Scream" },
        { ThingState.SPOS_DIE3, "A_Fall" },
        { ThingState.SPOS_XDIE2, "A_XScream" },
        { ThingState.SPOS_XDIE3, "A_Fall" },

        { ThingState.SARG_STND, "A_Look" },
        { ThingState.SARG_STND2, "A_Look" },
        { ThingState.SARG_RUN1, "A_Chase" },
        { ThingState.SARG_RUN2, "A_Chase" },
        { ThingState.SARG_RUN3, "A_Chase" },
        { ThingState.SARG_RUN4, "A_Chase" },
        { ThingState.SARG_RUN5, "A_Chase" },
        { ThingState.SARG_RUN6, "A_Chase" },
        { ThingState.SARG_RUN7, "A_Chase" },
        { ThingState.SARG_RUN8, "A_Chase" },
        { ThingState.SARG_ATK1, "A_FaceTarget" },
        { ThingState.SARG_ATK2, "A_FaceTarget" },
        { ThingState.SARG_ATK3, "A_SargAttack" },
        { ThingState.SARG_PAIN2, "A_Pain" },
        { ThingState.SARG_DIE2, "A_Scream" },
        { ThingState.SARG_DIE4, "A_Fall" },

        { ThingState.HEAD_STND, "A_Look" },
        { ThingState.HEAD_RUN1, "A_Chase" },
        { ThingState.HEAD_ATK1, "A_FaceTarget" },
        { ThingState.HEAD_ATK2, "A_FaceTarget" },
        { ThingState.HEAD_ATK3, "A_HeadAttack" },
        { ThingState.HEAD_PAIN2, "A_Pain" },
        { ThingState.HEAD_DIE2, "A_Scream" },
        { ThingState.HEAD_DIE5, "A_Fall" },

        { ThingState.VILE_STND, "A_Look" },
        { ThingState.VILE_STND2, "A_Look" },
        { ThingState.VILE_RUN1, "A_Chase" },
        { ThingState.VILE_RUN2, "A_Chase" },
        { ThingState.VILE_RUN3, "A_Chase" },
        { ThingState.VILE_RUN4, "A_Chase" },
        { ThingState.VILE_RUN5, "A_Chase" },
        { ThingState.VILE_RUN6, "A_Chase" },
        { ThingState.VILE_RUN7, "A_Chase" },
        { ThingState.VILE_RUN8, "A_Chase" },
        { ThingState.VILE_RUN9, "A_Chase" },
        { ThingState.VILE_RUN10, "A_Chase" },
        { ThingState.VILE_RUN11, "A_Chase" },
        { ThingState.VILE_RUN12, "A_Chase" },
        { ThingState.VILE_ATK1, "A_VileStart" },
        { ThingState.VILE_ATK2, "A_FaceTarget" },
        { ThingState.VILE_ATK3, "A_VileTarget" },
        { ThingState.VILE_ATK4, "A_FaceTarget" },
        { ThingState.VILE_ATK5, "A_FaceTarget" },
        { ThingState.VILE_ATK6, "A_FaceTarget" },
        { ThingState.VILE_ATK7, "A_FaceTarget" },
        { ThingState.VILE_ATK8, "A_FaceTarget" },
        { ThingState.VILE_ATK9, "A_FaceTarget" },
        { ThingState.VILE_ATK10, "A_VileAttack" },
        { ThingState.VILE_PAIN2, "A_Pain" },
        { ThingState.VILE_DIE2, "A_Scream" },
        { ThingState.VILE_DIE3, "A_Fall" },

        { ThingState.FIRE1, "A_StartFire" },
        { ThingState.FIRE2, "A_Fire" },
        { ThingState.FIRE3, "A_Fire" },
        { ThingState.FIRE4, "A_Fire" },
        { ThingState.FIRE5, "A_FireCrackle" },
        { ThingState.FIRE6, "A_Fire" },
        { ThingState.FIRE7, "A_Fire" },
        { ThingState.FIRE8, "A_Fire" },
        { ThingState.FIRE9, "A_Fire" },
        { ThingState.FIRE10, "A_Fire" },
        { ThingState.FIRE11, "A_Fire" },
        { ThingState.FIRE12, "A_Fire" },
        { ThingState.FIRE13, "A_Fire" },
        { ThingState.FIRE14, "A_Fire" },
        { ThingState.FIRE15, "A_Fire" },
        { ThingState.FIRE16, "A_Fire" },
        { ThingState.FIRE17, "A_Fire" },
        { ThingState.FIRE18, "A_Fire" },
        { ThingState.FIRE19, "A_FireCrackle" },
        { ThingState.FIRE20, "A_Fire" },
        { ThingState.FIRE21, "A_Fire" },
        { ThingState.FIRE22, "A_Fire" },
        { ThingState.FIRE23, "A_Fire" },
        { ThingState.FIRE24, "A_Fire" },
        { ThingState.FIRE25, "A_Fire" },
        { ThingState.FIRE26, "A_Fire" },
        { ThingState.FIRE27, "A_Fire" },
        { ThingState.FIRE28, "A_Fire" },
        { ThingState.FIRE29, "A_Fire" },
        { ThingState.FIRE30, "A_Fire" },

        { ThingState.TRACER, "A_Tracer" },
        { ThingState.TRACER2, "A_Tracer" },

        { ThingState.SKEL_STND, "A_Look" },
        { ThingState.SKEL_STND2, "A_Look" },
        { ThingState.SKEL_RUN1, "A_Chase" },
        { ThingState.SKEL_RUN2, "A_Chase" },
        { ThingState.SKEL_RUN3, "A_Chase" },
        { ThingState.SKEL_RUN4, "A_Chase" },
        { ThingState.SKEL_RUN5, "A_Chase" },
        { ThingState.SKEL_RUN6, "A_Chase" },
        { ThingState.SKEL_RUN7, "A_Chase" },
        { ThingState.SKEL_RUN8, "A_Chase" },
        { ThingState.SKEL_RUN9, "A_Chase" },
        { ThingState.SKEL_RUN10, "A_Chase" },
        { ThingState.SKEL_RUN11, "A_Chase" },
        { ThingState.SKEL_RUN12, "A_Chase" },
        { ThingState.SKEL_FIST1, "A_FaceTarget" },
        { ThingState.SKEL_FIST2, "A_SkelWhoosh" },
        { ThingState.SKEL_FIST3, "A_FaceTarget" },
        { ThingState.SKEL_FIST4, "A_SkelFist" },
        { ThingState.SKEL_MISS1, "A_FaceTarget" },
        { ThingState.SKEL_MISS2, "A_FaceTarget" },
        { ThingState.SKEL_MISS3, "A_SkelMissile" },
        { ThingState.SKEL_MISS4, "A_FaceTarget" },
        { ThingState.SKEL_PAIN2, "A_Pain" },
        { ThingState.SKEL_DIE3, "A_Scream" },
        { ThingState.SKEL_DIE4, "A_Fall" },

        { ThingState.FATT_STND, "A_Look" },
        { ThingState.FATT_STND2, "A_Look" },
        { ThingState.FATT_RUN1, "A_Chase" },
        { ThingState.FATT_RUN2, "A_Chase" },
        { ThingState.FATT_RUN3, "A_Chase" },
        { ThingState.FATT_RUN4, "A_Chase" },
        { ThingState.FATT_RUN5, "A_Chase" },
        { ThingState.FATT_RUN6, "A_Chase" },
        { ThingState.FATT_RUN7, "A_Chase" },
        { ThingState.FATT_RUN8, "A_Chase" },
        { ThingState.FATT_RUN9, "A_Chase" },
        { ThingState.FATT_RUN10, "A_Chase" },
        { ThingState.FATT_RUN11, "A_Chase" },
        { ThingState.FATT_RUN12, "A_Chase" },
        { ThingState.FATT_ATK1, "A_FatAttack1" },
        { ThingState.FATT_ATK2, "A_FatAttack1" },
        { ThingState.FATT_ATK3, "A_FaceTarget" },
        { ThingState.FATT_ATK4, "A_FaceTarget" },
        { ThingState.FATT_ATK5, "A_FatAttack2" },
        { ThingState.FATT_ATK6, "A_FaceTarget" },
        { ThingState.FATT_ATK7, "A_FaceTarget" },
        { ThingState.FATT_ATK8, "A_FatAttack3" },
        { ThingState.FATT_ATK9, "A_FaceTarget" },
        { ThingState.FATT_ATK10, "A_FaceTarget" },
        { ThingState.FATT_PAIN2, "A_Pain" },
        { ThingState.FATT_DIE2, "A_Scream" },
        { ThingState.FATT_DIE3, "A_Fall" },
        { ThingState.FATT_DIE10, "A_BossDeath" },

        { ThingState.CPOS_STND, "A_Look" },
        { ThingState.CPOS_STND2, "A_Look" },
        { ThingState.CPOS_RUN1, "A_Chase" },
        { ThingState.CPOS_RUN2, "A_Chase" },
        { ThingState.CPOS_RUN3, "A_Chase" },
        { ThingState.CPOS_RUN4, "A_Chase" },
        { ThingState.CPOS_RUN5, "A_Chase" },
        { ThingState.CPOS_RUN6, "A_Chase" },
        { ThingState.CPOS_RUN7, "A_Chase" },
        { ThingState.CPOS_RUN8, "A_Chase" },
        { ThingState.CPOS_ATK1, "A_FaceTarget" },
        { ThingState.CPOS_ATK2, "A_CPosAttack" },
        { ThingState.CPOS_ATK3, "A_CPosAttack" },
        { ThingState.CPOS_ATK4, "A_CPosRefire" },
        { ThingState.CPOS_PAIN2, "A_Pain" },
        { ThingState.CPOS_DIE2, "A_Scream" },
        { ThingState.CPOS_DIE3, "A_Fall" },
        { ThingState.CPOS_XDIE2, "A_XScream" },
        { ThingState.CPOS_XDIE3, "A_Fall" },

        { ThingState.TROO_STND, "A_Look" },
        { ThingState.TROO_STND2, "A_Look" },
        { ThingState.TROO_RUN1, "A_Chase" },
        { ThingState.TROO_RUN2, "A_Chase" },
        { ThingState.TROO_RUN3, "A_Chase" },
        { ThingState.TROO_RUN4, "A_Chase" },
        { ThingState.TROO_RUN5, "A_Chase" },
        { ThingState.TROO_RUN6, "A_Chase" },
        { ThingState.TROO_RUN7, "A_Chase" },
        { ThingState.TROO_RUN8, "A_Chase" },
        { ThingState.TROO_ATK1, "A_FaceTarget" },
        { ThingState.TROO_ATK2, "A_FaceTarget" },
        { ThingState.TROO_ATK3, "A_TroopAttack" },
        { ThingState.TROO_PAIN2, "A_Pain" },
        { ThingState.TROO_DIE2, "A_Scream" },
        { ThingState.TROO_DIE4, "A_Fall" },
        { ThingState.TROO_XDIE2, "A_Scream" },
        { ThingState.TROO_XDIE4, "A_Fall" },

        { ThingState.BOSS_STND, "A_Look" },
        { ThingState.BOSS_STND2, "A_Look" },
        { ThingState.BOSS_RUN1, "A_Chase" },
        { ThingState.BOSS_RUN2, "A_Chase" },
        { ThingState.BOSS_RUN3, "A_Chase" },
        { ThingState.BOSS_RUN4, "A_Chase" },
        { ThingState.BOSS_RUN5, "A_Chase" },
        { ThingState.BOSS_RUN6, "A_Chase" },
        { ThingState.BOSS_RUN7, "A_Chase" },
        { ThingState.BOSS_RUN8, "A_Chase" },
        { ThingState.BOSS_ATK1, "A_FaceTarget" },
        { ThingState.BOSS_ATK2, "A_FaceTarget" },
        { ThingState.BOSS_ATK3, "A_BruisAttack" },
        { ThingState.BOSS_PAIN2, "A_Pain" },
        { ThingState.BOSS_DIE2, "A_Scream" },
        { ThingState.BOSS_DIE3, "A_Fall" },
        { ThingState.BOSS_DIE7, "A_BossDeath" },

        { ThingState.BOS2_STND, "A_Look" },
        { ThingState.BOS2_STND2, "A_Look" },
        { ThingState.BOS2_RUN1, "A_Chase" },
        { ThingState.BOS2_RUN2, "A_Chase" },
        { ThingState.BOS2_RUN3, "A_Chase" },
        { ThingState.BOS2_RUN4, "A_Chase" },
        { ThingState.BOS2_RUN5, "A_Chase" },
        { ThingState.BOS2_RUN6, "A_Chase" },
        { ThingState.BOS2_RUN7, "A_Chase" },
        { ThingState.BOS2_RUN8, "A_Chase" },
        { ThingState.BOS2_ATK1, "A_FaceTarget" },
        { ThingState.BOS2_ATK2, "A_FaceTarget" },
        { ThingState.BOS2_ATK3, "A_BruisAttack" },
        { ThingState.BOS2_PAIN2, "A_Pain" },
        { ThingState.BOS2_DIE2, "A_Scream" },
        { ThingState.BOS2_DIE3, "A_Fall" },

        { ThingState.SKULL_STND, "A_Look" },
        { ThingState.SKULL_STND2, "A_Look" },
        { ThingState.SKULL_RUN1, "A_Chase" },
        { ThingState.SKULL_RUN2, "A_Chase" },
        { ThingState.SKULL_ATK1, "A_FaceTarget" },
        { ThingState.SKULL_ATK2, "A_SkullAttack" },
        { ThingState.SKULL_PAIN2, "A_Pain" },
        { ThingState.SKULL_DIE2, "A_Scream" },
        { ThingState.SKULL_DIE4, "A_Fall" },

        { ThingState.SPID_STND, "A_Look" },
        { ThingState.SPID_STND2, "A_Look" },
        { ThingState.SPID_RUN1, "A_Metal" },
        { ThingState.SPID_RUN2, "A_Chase" },
        { ThingState.SPID_RUN3, "A_Chase" },
        { ThingState.SPID_RUN4, "A_Chase" },
        { ThingState.SPID_RUN5, "A_Metal" },
        { ThingState.SPID_RUN6, "A_Chase" },
        { ThingState.SPID_RUN7, "A_Chase" },
        { ThingState.SPID_RUN8, "A_Chase" },
        { ThingState.SPID_RUN9, "A_Metal" },
        { ThingState.SPID_RUN10, "A_Chase" },
        { ThingState.SPID_RUN11, "A_Chase" },
        { ThingState.SPID_RUN12, "A_Chase" },
        { ThingState.SPID_ATK1, "A_FaceTarget" },
        { ThingState.SPID_ATK2, "A_SPosAttackUseAtkSound" },
        { ThingState.SPID_ATK3, "A_SPosAttackUseAtkSound" },
        { ThingState.SPID_ATK4, "A_SpidRefire" },
        { ThingState.SPID_PAIN2, "A_Pain" },
        { ThingState.SPID_DIE1, "A_Scream" },
        { ThingState.SPID_DIE2, "A_Fall" },
        { ThingState.SPID_DIE11, "A_BossDeath" },

        { ThingState.BSPI_STND, "A_Look" },
        { ThingState.BSPI_STND2, "A_Look" },
        { ThingState.BSPI_RUN1, "A_BabyMetal" },
        { ThingState.BSPI_RUN2, "A_Chase" },
        { ThingState.BSPI_RUN3, "A_Chase" },
        { ThingState.BSPI_RUN4, "A_Chase" },
        { ThingState.BSPI_RUN5, "A_Metal" },
        { ThingState.BSPI_RUN6, "A_Chase" },
        { ThingState.BSPI_RUN7, "A_Chase" },
        { ThingState.BSPI_RUN8, "A_BabyMetal" },
        { ThingState.BSPI_RUN9, "A_Chase" },
        { ThingState.BSPI_RUN10, "A_Chase" },
        { ThingState.BSPI_RUN11, "A_Chase" },
        { ThingState.BSPI_RUN12, "A_Chase" },
        { ThingState.BSPI_ATK1, "A_FaceTarget" },
        { ThingState.BSPI_ATK2, "A_BspiAttack" },
        { ThingState.BSPI_ATK4, "A_SpidRefire" },
        { ThingState.BSPI_PAIN2, "A_Pain" },
        { ThingState.BSPI_DIE1, "A_Scream" },
        { ThingState.BSPI_DIE2, "A_Fall" },

        { ThingState.CYBER_STND, "A_Look" },
        { ThingState.CYBER_STND2, "A_Look" },
        { ThingState.CYBER_RUN1, "A_Hoof" },
        { ThingState.CYBER_RUN2, "A_Chase" },
        { ThingState.CYBER_RUN3, "A_Chase" },
        { ThingState.CYBER_RUN4, "A_Chase" },
        { ThingState.CYBER_RUN5, "A_Metal" },
        { ThingState.CYBER_RUN6, "A_Chase" },
        { ThingState.CYBER_RUN7, "A_Metal" },
        { ThingState.CYBER_RUN8, "A_Chase" },
        { ThingState.CYBER_ATK1, "A_FaceTarget" },
        { ThingState.CYBER_ATK2, "A_CyberAttack" },
        { ThingState.CYBER_ATK3, "A_FaceTarget" },
        { ThingState.CYBER_ATK4, "A_CyberAttack" },
        { ThingState.CYBER_ATK5, "A_FaceTarget" },
        { ThingState.CYBER_ATK6, "A_CyberAttack" },
        { ThingState.CYBER_PAIN, "A_Pain" },
        { ThingState.CYBER_DIE2, "A_Scream" },
        { ThingState.CYBER_DIE6, "A_Fall" },
        { ThingState.CYBER_DIE10, "A_BossDeath" },

        { ThingState.PAIN_STND, "A_Look" },
        { ThingState.PAIN_RUN1, "A_Chase" },
        { ThingState.PAIN_RUN2, "A_Chase" },
        { ThingState.PAIN_RUN3, "A_Chase" },
        { ThingState.PAIN_RUN4, "A_Chase" },
        { ThingState.PAIN_RUN5, "A_Chase" },
        { ThingState.PAIN_RUN6, "A_Chase" },
        { ThingState.PAIN_ATK1, "A_FaceTarget" },
        { ThingState.PAIN_ATK2, "A_FaceTarget" },
        { ThingState.PAIN_ATK3, "A_FaceTarget" },
        { ThingState.PAIN_ATK4, "A_PainAttack" },
        { ThingState.PAIN_PAIN2, "A_Pain" },
        { ThingState.PAIN_DIE2, "A_Scream" },
        { ThingState.PAIN_DIE5, "A_PainDie" },

        { ThingState.SSWV_STND, "A_Look" },
        { ThingState.SSWV_STND2, "A_Look" },
        { ThingState.SSWV_RUN1, "A_Chase" },
        { ThingState.SSWV_RUN2, "A_Chase" },
        { ThingState.SSWV_RUN3, "A_Chase" },
        { ThingState.SSWV_RUN4, "A_Chase" },
        { ThingState.SSWV_RUN5, "A_Chase" },
        { ThingState.SSWV_RUN6, "A_Chase" },
        { ThingState.SSWV_RUN7, "A_Chase" },
        { ThingState.SSWV_RUN8, "A_Chase" },
        { ThingState.SSWV_ATK1, "A_FaceTarget" },
        { ThingState.SSWV_ATK2, "A_FaceTarget" },
        { ThingState.SSWV_ATK3, "A_CPosAttack" },
        { ThingState.SSWV_ATK4, "A_FaceTarget" },
        { ThingState.SSWV_ATK5, "A_CPosAttack" },
        { ThingState.SSWV_ATK6, "A_CPosRefire" },
        { ThingState.SSWV_PAIN2, "A_Pain" },
        { ThingState.SSWV_DIE2, "A_Scream" },
        { ThingState.SSWV_DIE3, "A_Fall" },
        { ThingState.SSWV_XDIE2, "A_XScream" },
        { ThingState.SSWV_XDIE3, "A_Fall" },

        { ThingState.COMMKEEN3, "A_Scream" },
        { ThingState.COMMKEEN11, "A_KeenDie" },
        { ThingState.KEENPAIN2, "A_Pain" },

        { ThingState.BRAIN_PAIN, "A_BrainPain" },
        { ThingState.BRAIN_DIE1, "A_BrainScream" },
        { ThingState.BRAIN_DIE4, "A_BrainDie" },

        { ThingState.BRAINEYE, "A_Look" },
        { ThingState.BRAINEYESEE, "A_BrainAwake" },
        { ThingState.BRAINEYE1, "A_BrainSpit" },

        { ThingState.SPAWN1, "A_SpawnSound" },
        { ThingState.SPAWN2, "A_SpawnFly" },
        { ThingState.SPAWN3, "A_SpawnFly" },
        { ThingState.SPAWN4, "A_SpawnFly" },

        { ThingState.SPAWNFIRE1, "A_Fire" },
        { ThingState.SPAWNFIRE2, "A_Fire" },
        { ThingState.SPAWNFIRE3, "A_Fire" },
        { ThingState.SPAWNFIRE4, "A_Fire" },
        { ThingState.SPAWNFIRE5, "A_Fire" },
        { ThingState.SPAWNFIRE6, "A_Fire" },
        { ThingState.SPAWNFIRE7, "A_Fire" },
        { ThingState.SPAWNFIRE8, "A_Fire" },

        { ThingState.BEXP2, "A_Scream" },
        { ThingState.BEXP4, "A_Explode" },

        { ThingState.GRENADE, "A_Die" },

        { ThingState.DETONATE, "A_Scream" },
        { ThingState.DETONATE2, "A_Detonate" },

        { ThingState.DOGS_STND, "A_Look" },
        { ThingState.DOGS_STND2, "A_Look" },
        { ThingState.DOGS_RUN1, "A_Chase" },
        { ThingState.DOGS_RUN2, "A_Chase" },
        { ThingState.DOGS_RUN3, "A_Chase" },
        { ThingState.DOGS_RUN4, "A_Chase" },
        { ThingState.DOGS_RUN5, "A_Chase" },
        { ThingState.DOGS_RUN6, "A_Chase" },
        { ThingState.DOGS_RUN7, "A_Chase" },
        { ThingState.DOGS_RUN8, "A_Chase" },
        { ThingState.DOGS_ATK1, "A_FaceTarget" },
        { ThingState.DOGS_ATK2, "A_FaceTarget" },
        { ThingState.DOGS_ATK3, "A_SargAttack" },
        { ThingState.DOGS_PAIN2, "A_Pain" },
        { ThingState.DOGS_DIE2, "A_Scream" },
        { ThingState.DOGS_DIE4, "A_Fall" },

        { ThingState.OLDBFG1, "A_BFGSound" },
        { ThingState.OLDBFG2, "A_FireOldBFG" },
        { ThingState.OLDBFG3, "A_FireOldBFG" },
        { ThingState.OLDBFG4, "A_FireOldBFG" },
        { ThingState.OLDBFG5, "A_FireOldBFG" },
        { ThingState.OLDBFG6, "A_FireOldBFG" },
        { ThingState.OLDBFG7, "A_FireOldBFG" },
        { ThingState.OLDBFG8, "A_FireOldBFG" },
        { ThingState.OLDBFG9, "A_FireOldBFG" },
        { ThingState.OLDBFG10, "A_FireOldBFG" },
        { ThingState.OLDBFG11, "A_FireOldBFG" },
        { ThingState.OLDBFG12, "A_FireOldBFG" },
        { ThingState.OLDBFG13, "A_FireOldBFG" },
        { ThingState.OLDBFG14, "A_FireOldBFG" },
        { ThingState.OLDBFG15, "A_FireOldBFG" },
        { ThingState.OLDBFG16, "A_FireOldBFG" },
        { ThingState.OLDBFG17, "A_FireOldBFG" },
        { ThingState.OLDBFG18, "A_FireOldBFG" },
        { ThingState.OLDBFG19, "A_FireOldBFG" },
        { ThingState.OLDBFG20, "A_FireOldBFG" },
        { ThingState.OLDBFG21, "A_FireOldBFG" },
        { ThingState.OLDBFG22, "A_FireOldBFG" },
        { ThingState.OLDBFG23, "A_FireOldBFG" },
        { ThingState.OLDBFG24, "A_FireOldBFG" },
        { ThingState.OLDBFG25, "A_FireOldBFG" },
        { ThingState.OLDBFG26, "A_FireOldBFG" },
        { ThingState.OLDBFG27, "A_FireOldBFG" },
        { ThingState.OLDBFG28, "A_FireOldBFG" },
        { ThingState.OLDBFG29, "A_FireOldBFG" },
        { ThingState.OLDBFG30, "A_FireOldBFG" },
        { ThingState.OLDBFG31, "A_FireOldBFG" },
        { ThingState.OLDBFG32, "A_FireOldBFG" },
        { ThingState.OLDBFG33, "A_FireOldBFG" },
        { ThingState.OLDBFG34, "A_FireOldBFG" },
        { ThingState.OLDBFG35, "A_FireOldBFG" },
        { ThingState.OLDBFG36, "A_FireOldBFG" },
        { ThingState.OLDBFG37, "A_FireOldBFG" },
        { ThingState.OLDBFG38, "A_FireOldBFG" },
        { ThingState.OLDBFG39, "A_FireOldBFG" },
        { ThingState.OLDBFG40, "A_FireOldBFG" },
        { ThingState.OLDBFG41, "A_FireOldBFG" },
        { ThingState.OLDBFG42, "A_Light0" },
        { ThingState.OLDBFG43, "A_ReFire" },

        { ThingState.BSKUL_STND, "A_Look" },
        { ThingState.BSKUL_RUN1, "A_Chase" },
        { ThingState.BSKUL_RUN2, "A_Chase" },
        { ThingState.BSKUL_RUN3, "A_Chase" },
        { ThingState.BSKUL_RUN4, "A_Chase" },
        { ThingState.BSKUL_ATK1, "A_FaceTarget" },
        { ThingState.BSKUL_ATK2, "A_BetaSkullAttack" },
        { ThingState.BSKUL_PAIN2, "A_Pain" },
        { ThingState.BSKUL_DIE5, "A_Scream" },
        { ThingState.BSKUL_DIE7, "A_Fall" },
        { ThingState.BSKUL_DIE8, "A_Stop" },

        { ThingState.MUSHROOM, "A_Mushroom" },
    };

    public class ThingStateLookup
    {
        public ThingStateLookup(string sprite, int offset, string? actorName = null, int? frame = null)
        {
            Sprite = sprite;
            Offset = offset;
            ActorName = actorName;
            Frame = frame;
        }

        public string? ActorName { get; set; }
        public string Sprite { get; set; }
        public int Offset { get; set; }
        public int? Frame { get; set; }
    }

    public const int FullBright = 0x8000;
    public const int FrameMask = 0x7fff;

    public readonly ThingStateLookup[] ThingStateLookups = new[]
    {
        new ThingStateLookup("TNT1", 0),                 // NULL,
        new ThingStateLookup("SHTG", 0, "Weapon"),       // LIGHTDONE,
        new ThingStateLookup("PUNG", 0),                 // PUNCH,
        new ThingStateLookup("PUNG", 1),                 // PUNCHDOWN,
        new ThingStateLookup("PUNG", 2),                 // PUNCHUP,
        new ThingStateLookup("PUNG", 3),                 // PUNCH1,
        new ThingStateLookup("PUNG", 4),                 // PUNCH2,
        new ThingStateLookup("PUNG", 5),                 // PUNCH3,
        new ThingStateLookup("PUNG", 6),                 // PUNCH4,
        new ThingStateLookup("PUNG", 7),                 // PUNCH5,
        new ThingStateLookup("PISG", 0),                 // PISTOL,
        new ThingStateLookup("PISG", 1),                 // PISTOLDOWN,
        new ThingStateLookup("PISG", 2),                 // PISTOLUP,
        new ThingStateLookup("PISG", 3),                 // PISTOL1,
        new ThingStateLookup("PISG", 4),                 // PISTOL2,
        new ThingStateLookup("PISG", 5),                 // PISTOL3,
        new ThingStateLookup("PISG", 6),                 // PISTOL4,
        new ThingStateLookup("PISF", 0),                 // PISTOLFLASH,
        new ThingStateLookup("SHTG", 0, "Shotgun"),      // SGUN,
        new ThingStateLookup("SHTG", 1, "Shotgun"),      // SGUNDOWN,
        new ThingStateLookup("SHTG", 2, "Shotgun"),      // SGUNUP,
        new ThingStateLookup("SHTG", 3, "Shotgun"),      // SGUN1,
        new ThingStateLookup("SHTG", 4, "Shotgun"),      // SGUN2,
        new ThingStateLookup("SHTG", 5, "Shotgun"),      // SGUN3,
        new ThingStateLookup("SHTG", 6, "Shotgun"),      // SGUN4,
        new ThingStateLookup("SHTG", 7, "Shotgun"),      // SGUN5,
        new ThingStateLookup("SHTG", 8, "Shotgun"),      // SGUN6,
        new ThingStateLookup("SHTG", 9, "Shotgun"),      // SGUN7,
        new ThingStateLookup("SHTG", 10, "Shotgun"),     // SGUN8,
        new ThingStateLookup("SHTG", 11, "Shotgun"),     // SGUN9,
        new ThingStateLookup("SHTF", 0),                 // SGUNFLASH1,
        new ThingStateLookup("SHTF", 1),                 // SGUNFLASH2,
        new ThingStateLookup("SHT2", 0),                 // DSGUN,
        new ThingStateLookup("SHT2", 1),                 // DSGUNDOWN,
        new ThingStateLookup("SHT2", 2),                 // DSGUNUP,
        new ThingStateLookup("SHT2", 3),                 // DSGUN1,
        new ThingStateLookup("SHT2", 4),                 // DSGUN2,
        new ThingStateLookup("SHT2", 5),                 // DSGUN3,
        new ThingStateLookup("SHT2", 6),                 // DSGUN4,
        new ThingStateLookup("SHT2", 7),                 // DSGUN5,
        new ThingStateLookup("SHT2", 8),                 // DSGUN6,
        new ThingStateLookup("SHT2", 9),                 // DSGUN7,
        new ThingStateLookup("SHT2", 10),                // DSGUN8,
        new ThingStateLookup("SHT2", 11),                // DSGUN9,
        new ThingStateLookup("SHT2", 12),                // DSGUN10,
        new ThingStateLookup("SHT2", 13),                // DSNR1,
        new ThingStateLookup("SHT2", 14),                // DSNR2,
        new ThingStateLookup("SHT2", 15),                // DSGUNFLASH1,
        new ThingStateLookup("SHT2", 16),                // DSGUNFLASH2,
        new ThingStateLookup("CHGG", 0),                 // CHAIN,
        new ThingStateLookup("CHGG", 1),                 // CHAINDOWN,
        new ThingStateLookup("CHGG", 2),                 // CHAINUP,
        new ThingStateLookup("CHGG", 3),                 // CHAIN1,
        new ThingStateLookup("CHGG", 4),                 // CHAIN2,
        new ThingStateLookup("CHGG", 5),                 // CHAIN3,
        new ThingStateLookup("CHGF", 0),                 // CHAINFLASH1,
        new ThingStateLookup("CHGF", 1),                 // CHAINFLASH2,
        new ThingStateLookup("MISG", 0),                 // MISSILE,
        new ThingStateLookup("MISG", 1),                 // MISSILEDOWN,
        new ThingStateLookup("MISG", 2),                 // MISSILEUP,
        new ThingStateLookup("MISG", 3),                 // MISSILE1,
        new ThingStateLookup("MISG", 4),                 // MISSILE2,
        new ThingStateLookup("MISG", 5),                 // MISSILE3,
        new ThingStateLookup("MISF", 0),                 // MISSILEFLASH1,
        new ThingStateLookup("MISF", 1),                 // MISSILEFLASH2,
        new ThingStateLookup("MISF", 2),                 // MISSILEFLASH3,
        new ThingStateLookup("MISF", 3),                 // MISSILEFLASH4,
        new ThingStateLookup("SAWG", 0),                 // SAW,
        new ThingStateLookup("SAWG", 1),                 // SAWB,
        new ThingStateLookup("SAWG", 2),                 // SAWDOWN,
        new ThingStateLookup("SAWG", 3),                 // SAWUP,
        new ThingStateLookup("SAWG", 4),                 // SAW1,
        new ThingStateLookup("SAWG", 5),                 // SAW2,
        new ThingStateLookup("SAWG", 6),                 // SAW3,
        new ThingStateLookup("PLSG", 0),                 // PLASMA,
        new ThingStateLookup("PLSG", 1),                 // PLASMADOWN,
        new ThingStateLookup("PLSG", 2),                 // PLASMAUP,
        new ThingStateLookup("PLSG", 3),                 // PLASMA1,
        new ThingStateLookup("PLSG", 4),                 // PLASMA2,
        new ThingStateLookup("PLSF", 0),                 // PLASMAFLASH1,
        new ThingStateLookup("PLSF", 1),                 // PLASMAFLASH2,
        new ThingStateLookup("BFGG", 0),                 // BFG,
        new ThingStateLookup("BFGG", 1),                 // BFGDOWN,
        new ThingStateLookup("BFGG", 2),                 // BFGUP,
        new ThingStateLookup("BFGG", 3),                 // BFG1,
        new ThingStateLookup("BFGG", 4),                 // BFG2,
        new ThingStateLookup("BFGG", 5),                 // BFG3,
        new ThingStateLookup("BFGG", 6),                 // BFG4,
        new ThingStateLookup("BFGF", 0),                 // BFGFLASH1,
        new ThingStateLookup("BFGF", 1),                 // BFGFLASH2,
        new ThingStateLookup("BLUD", 0),                 // BLOOD1,
        new ThingStateLookup("BLUD", 1),                 // BLOOD2,
        new ThingStateLookup("BLUD", 2),                 // BLOOD3,
        new ThingStateLookup("PUFF", 0, "BulletPuff"),   // PUFF1,
        new ThingStateLookup("PUFF", 1, "BulletPuff"),   // PUFF2,
        new ThingStateLookup("PUFF", 2, "BulletPuff"),   // PUFF3,
        new ThingStateLookup("PUFF", 3, "BulletPuff"),   // PUFF4,
        new ThingStateLookup("BAL1", 0),                 // TBALL1,
        new ThingStateLookup("BAL1", 1),                 // TBALL2,
        new ThingStateLookup("BAL1", 2),                 // TBALLX1,
        new ThingStateLookup("BAL1", 3),                 // TBALLX2,
        new ThingStateLookup("BAL1", 4),                 // TBALLX3,
        new ThingStateLookup("BAL2", 0),                 // RBALL1,
        new ThingStateLookup("BAL2", 1),                 // RBALL2,
        new ThingStateLookup("BAL2", 2),                 // RBALLX1,
        new ThingStateLookup("BAL2", 3),                 // RBALLX2,
        new ThingStateLookup("BAL2", 4),                 // RBALLX3,
        new ThingStateLookup("PLSS", 0),                 // PLASBALL,
        new ThingStateLookup("PLSS", 1),                 // PLASBALL2,
        new ThingStateLookup("PLSE", 0),                 // PLASEXP,
        new ThingStateLookup("PLSE", 1),                 // PLASEXP2,
        new ThingStateLookup("PLSE", 2),                 // PLASEXP3,
        new ThingStateLookup("PLSE", 3),                 // PLASEXP4,
        new ThingStateLookup("PLSE", 4),                 // PLASEXP5,
        new ThingStateLookup("MISL", 0, "Rocket", 0),    // ROCKET,
        new ThingStateLookup("BFS1", 0),                 // BFGSHOT,
        new ThingStateLookup("BFS1", 1),                 // BFGSHOT2,
        new ThingStateLookup("BFE1", 0),                 // BFGLAND,
        new ThingStateLookup("BFE1", 1),                 // BFGLAND2,
        new ThingStateLookup("BFE1", 2),                 // BFGLAND3,
        new ThingStateLookup("BFE1", 3),                 // BFGLAND4,
        new ThingStateLookup("BFE1", 4),                 // BFGLAND5,
        new ThingStateLookup("BFE1", 5),                 // BFGLAND6,
        new ThingStateLookup("BFE2", 0),                 // BFGEXP,
        new ThingStateLookup("BFE2", 1),                 // BFGEXP2,
        new ThingStateLookup("BFE2", 2),                 // BFGEXP3,
        new ThingStateLookup("BFE2", 3),                 // BFGEXP4,
        new ThingStateLookup("MISL", 0, "Rocket", 1),    // EXPLODE1,
        new ThingStateLookup("MISL", 0, "Rocket", 2),    // EXPLODE2,
        new ThingStateLookup("MISL", 0, "Rocket", 3),    // EXPLODE3,
        new ThingStateLookup("TFOG", 0),                 // TFOG,
        new ThingStateLookup("TFOG", 1),                 // TFOG01,
        new ThingStateLookup("TFOG", 2),                 // TFOG02,
        new ThingStateLookup("TFOG", 3),                 // TFOG2,
        new ThingStateLookup("TFOG", 4),                 // TFOG3,
        new ThingStateLookup("TFOG", 5),                 // TFOG4,
        new ThingStateLookup("TFOG", 6),                 // TFOG5,
        new ThingStateLookup("TFOG", 7),                 // TFOG6,
        new ThingStateLookup("TFOG", 8),                 // TFOG7,
        new ThingStateLookup("TFOG", 9),                 // TFOG8,
        new ThingStateLookup("TFOG", 10),                // TFOG9,
        new ThingStateLookup("TFOG", 11),                // TFOG10,
        new ThingStateLookup("IFOG", 0),                 // IFOG,
        new ThingStateLookup("IFOG", 1),                 // IFOG01,
        new ThingStateLookup("IFOG", 2),                 // IFOG02,
        new ThingStateLookup("IFOG", 3),                 // IFOG2,
        new ThingStateLookup("IFOG", 4),                 // IFOG3,
        new ThingStateLookup("IFOG", 5),                 // IFOG4,
        new ThingStateLookup("IFOG", 6),                 // IFOG5,
        new ThingStateLookup("PLAY", 0),                 // PLAY,
        new ThingStateLookup("PLAY", 1),                 // PLAY_RUN1,
        new ThingStateLookup("PLAY", 2),                 // PLAY_RUN2,
        new ThingStateLookup("PLAY", 3),                 // PLAY_RUN3,
        new ThingStateLookup("PLAY", 4),                 // PLAY_RUN4,
        new ThingStateLookup("PLAY", 5),                 // PLAY_ATK1,
        new ThingStateLookup("PLAY", 6),                 // PLAY_ATK2,
        new ThingStateLookup("PLAY", 7),                 // PLAY_PAIN,
        new ThingStateLookup("PLAY", 8),                 // PLAY_PAIN2,
        new ThingStateLookup("PLAY", 9),                 // PLAY_DIE1,
        new ThingStateLookup("PLAY", 10),                // PLAY_DIE2,
        new ThingStateLookup("PLAY", 11),                // PLAY_DIE3,
        new ThingStateLookup("PLAY", 12),                // PLAY_DIE4,
        new ThingStateLookup("PLAY", 13),                // PLAY_DIE5,
        new ThingStateLookup("PLAY", 14),                // PLAY_DIE6,
        new ThingStateLookup("PLAY", 15),                // PLAY_DIE7,
        new ThingStateLookup("PLAY", 16),                // PLAY_XDIE1,
        new ThingStateLookup("PLAY", 17),                // PLAY_XDIE2,
        new ThingStateLookup("PLAY", 18),                // PLAY_XDIE3,
        new ThingStateLookup("PLAY", 19),                // PLAY_XDIE4,
        new ThingStateLookup("PLAY", 20),                // PLAY_XDIE5,
        new ThingStateLookup("PLAY", 21),                // PLAY_XDIE6,
        new ThingStateLookup("PLAY", 22),                // PLAY_XDIE7,
        new ThingStateLookup("PLAY", 23),                // PLAY_XDIE8,
        new ThingStateLookup("PLAY", 24),                // PLAY_XDIE9,
        new ThingStateLookup("POSS", 0),                 // POSS_STND,
        new ThingStateLookup("POSS", 1),                 // POSS_STND2,
        new ThingStateLookup("POSS", 2),                 // POSS_RUN1,
        new ThingStateLookup("POSS", 3),                 // POSS_RUN2,
        new ThingStateLookup("POSS", 4),                 // POSS_RUN3,
        new ThingStateLookup("POSS", 5),                 // POSS_RUN4,
        new ThingStateLookup("POSS", 6),                 // POSS_RUN5,
        new ThingStateLookup("POSS", 7),                 // POSS_RUN6,
        new ThingStateLookup("POSS", 8),                 // POSS_RUN7,
        new ThingStateLookup("POSS", 9),                 // POSS_RUN8,
        new ThingStateLookup("POSS", 10),                // POSS_ATK1,
        new ThingStateLookup("POSS", 11),                // POSS_ATK2,
        new ThingStateLookup("POSS", 12),                // POSS_ATK3,
        new ThingStateLookup("POSS", 13),                // POSS_PAIN,
        new ThingStateLookup("POSS", 14),                // POSS_PAIN2,
        new ThingStateLookup("POSS", 15),                // POSS_DIE1,
        new ThingStateLookup("POSS", 16),                // POSS_DIE2,
        new ThingStateLookup("POSS", 17),                // POSS_DIE3,
        new ThingStateLookup("POSS", 18),                // POSS_DIE4,
        new ThingStateLookup("POSS", 19),                // POSS_DIE5,
        new ThingStateLookup("POSS", 20),                // POSS_XDIE1,
        new ThingStateLookup("POSS", 21),                // POSS_XDIE2,
        new ThingStateLookup("POSS", 22),                // POSS_XDIE3,
        new ThingStateLookup("POSS", 23),                // POSS_XDIE4,
        new ThingStateLookup("POSS", 24),                // POSS_XDIE5,
        new ThingStateLookup("POSS", 25),                // POSS_XDIE6,
        new ThingStateLookup("POSS", 26),                // POSS_XDIE7,
        new ThingStateLookup("POSS", 27),                // POSS_XDIE8,
        new ThingStateLookup("POSS", 28),                // POSS_XDIE9,
        new ThingStateLookup("POSS", 29),                // POSS_RAISE1,
        new ThingStateLookup("POSS", 30),                // POSS_RAISE2,
        new ThingStateLookup("POSS", 31),                // POSS_RAISE3,
        new ThingStateLookup("POSS", 32),                // POSS_RAISE4,
        new ThingStateLookup("SPOS", 0),                 // SPOS_STND,
        new ThingStateLookup("SPOS", 1),                 // SPOS_STND2,
        new ThingStateLookup("SPOS", 2),                 // SPOS_RUN1,
        new ThingStateLookup("SPOS", 3),                 // SPOS_RUN2,
        new ThingStateLookup("SPOS", 4),                 // SPOS_RUN3,
        new ThingStateLookup("SPOS", 5),                 // SPOS_RUN4,
        new ThingStateLookup("SPOS", 6),                 // SPOS_RUN5,
        new ThingStateLookup("SPOS", 7),                 // SPOS_RUN6,
        new ThingStateLookup("SPOS", 8),                 // SPOS_RUN7,
        new ThingStateLookup("SPOS", 9),                 // SPOS_RUN8,
        new ThingStateLookup("SPOS", 10),                // SPOS_ATK1,
        new ThingStateLookup("SPOS", 11),                // SPOS_ATK2,
        new ThingStateLookup("SPOS", 12),                // SPOS_ATK3,
        new ThingStateLookup("SPOS", 13),                // SPOS_PAIN,
        new ThingStateLookup("SPOS", 14),                // SPOS_PAIN2,
        new ThingStateLookup("SPOS", 15),                // SPOS_DIE1,
        new ThingStateLookup("SPOS", 16),                // SPOS_DIE2,
        new ThingStateLookup("SPOS", 17),                // SPOS_DIE3,
        new ThingStateLookup("SPOS", 18),                // SPOS_DIE4,
        new ThingStateLookup("SPOS", 19),                // SPOS_DIE5,
        new ThingStateLookup("SPOS", 20),                // SPOS_XDIE1,
        new ThingStateLookup("SPOS", 21),                // SPOS_XDIE2,
        new ThingStateLookup("SPOS", 22),                // SPOS_XDIE3,
        new ThingStateLookup("SPOS", 23),                // SPOS_XDIE4,
        new ThingStateLookup("SPOS", 24),                // SPOS_XDIE5,
        new ThingStateLookup("SPOS", 25),                // SPOS_XDIE6,
        new ThingStateLookup("SPOS", 26),                // SPOS_XDIE7,
        new ThingStateLookup("SPOS", 27),                // SPOS_XDIE8,
        new ThingStateLookup("SPOS", 28),                // SPOS_XDIE9,
        new ThingStateLookup("SPOS", 29),                // SPOS_RAISE1,
        new ThingStateLookup("SPOS", 30),                // SPOS_RAISE2,
        new ThingStateLookup("SPOS", 31),                // SPOS_RAISE3,
        new ThingStateLookup("SPOS", 32),                // SPOS_RAISE4,
        new ThingStateLookup("SPOS", 33),                // SPOS_RAISE5,
        new ThingStateLookup("VILE", 0),                 // VILE_STND,
        new ThingStateLookup("VILE", 1),                 // VILE_STND2,
        new ThingStateLookup("VILE", 2),                 // VILE_RUN1,
        new ThingStateLookup("VILE", 3),                 // VILE_RUN2,
        new ThingStateLookup("VILE", 4),                 // VILE_RUN3,
        new ThingStateLookup("VILE", 5),                 // VILE_RUN4,
        new ThingStateLookup("VILE", 6),                 // VILE_RUN5,
        new ThingStateLookup("VILE", 7),                 // VILE_RUN6,
        new ThingStateLookup("VILE", 8),                 // VILE_RUN7,
        new ThingStateLookup("VILE", 9),                 // VILE_RUN8,
        new ThingStateLookup("VILE", 10),                // VILE_RUN9,
        new ThingStateLookup("VILE", 11),                // VILE_RUN10,
        new ThingStateLookup("VILE", 12),                // VILE_RUN11,
        new ThingStateLookup("VILE", 13),                // VILE_RUN12,
        new ThingStateLookup("VILE", 14),                // VILE_ATK1,
        new ThingStateLookup("VILE", 15),                // VILE_ATK2,
        new ThingStateLookup("VILE", 16),                // VILE_ATK3,
        new ThingStateLookup("VILE", 17),                // VILE_ATK4,
        new ThingStateLookup("VILE", 18),                // VILE_ATK5,
        new ThingStateLookup("VILE", 19),                // VILE_ATK6,
        new ThingStateLookup("VILE", 20),                // VILE_ATK7,
        new ThingStateLookup("VILE", 21),                // VILE_ATK8,
        new ThingStateLookup("VILE", 22),                // VILE_ATK9,
        new ThingStateLookup("VILE", 23),                // VILE_ATK10,
        new ThingStateLookup("VILE", 24),                // VILE_ATK11,
        new ThingStateLookup("VILE", 25),                // VILE_HEAL1,
        new ThingStateLookup("VILE", 26),                // VILE_HEAL2,
        new ThingStateLookup("VILE", 27),                // VILE_HEAL3,
        new ThingStateLookup("VILE", 28),                // VILE_PAIN,
        new ThingStateLookup("VILE", 29),                // VILE_PAIN2,
        new ThingStateLookup("VILE", 30),                // VILE_DIE1,
        new ThingStateLookup("VILE", 31),                // VILE_DIE2,
        new ThingStateLookup("VILE", 32),                // VILE_DIE3,
        new ThingStateLookup("VILE", 33),                // VILE_DIE4,
        new ThingStateLookup("VILE", 34),                // VILE_DIE5,
        new ThingStateLookup("VILE", 35),                // VILE_DIE6,
        new ThingStateLookup("VILE", 36),                // VILE_DIE7,
        new ThingStateLookup("VILE", 37),                // VILE_DIE8,
        new ThingStateLookup("VILE", 38),                // VILE_DIE9,
        new ThingStateLookup("VILE", 39),                // VILE_DIE10,
        new ThingStateLookup("FIRE", 0, "ArchvileFire"), // FIRE1,
        new ThingStateLookup("FIRE", 1, "ArchvileFire"), // FIRE2,
        new ThingStateLookup("FIRE", 2, "ArchvileFire"), // FIRE3,
        new ThingStateLookup("FIRE", 3, "ArchvileFire"), // FIRE4,
        new ThingStateLookup("FIRE", 4, "ArchvileFire"), // FIRE5,
        new ThingStateLookup("FIRE", 5, "ArchvileFire"), // FIRE6,
        new ThingStateLookup("FIRE", 6, "ArchvileFire"), // FIRE7,
        new ThingStateLookup("FIRE", 7, "ArchvileFire"), // FIRE8,
        new ThingStateLookup("FIRE", 8, "ArchvileFire"), // FIRE9,
        new ThingStateLookup("FIRE", 9, "ArchvileFire"), // FIRE10,
        new ThingStateLookup("FIRE", 10, "ArchvileFire"),// FIRE11,
        new ThingStateLookup("FIRE", 11, "ArchvileFire"),// FIRE12,
        new ThingStateLookup("FIRE", 12, "ArchvileFire"),// FIRE13,
        new ThingStateLookup("FIRE", 13, "ArchvileFire"),// FIRE14,
        new ThingStateLookup("FIRE", 14, "ArchvileFire"),// FIRE15,
        new ThingStateLookup("FIRE", 15, "ArchvileFire"),// FIRE16,
        new ThingStateLookup("FIRE", 16, "ArchvileFire"),// FIRE17,
        new ThingStateLookup("FIRE", 17, "ArchvileFire"),// FIRE18,
        new ThingStateLookup("FIRE", 18, "ArchvileFire"),// FIRE19,
        new ThingStateLookup("FIRE", 19, "ArchvileFire"),// FIRE20,
        new ThingStateLookup("FIRE", 20, "ArchvileFire"),// FIRE21,
        new ThingStateLookup("FIRE", 21, "ArchvileFire"),// FIRE22,
        new ThingStateLookup("FIRE", 22, "ArchvileFire"),// FIRE23,
        new ThingStateLookup("FIRE", 23, "ArchvileFire"),// FIRE24,
        new ThingStateLookup("FIRE", 24, "ArchvileFire"),// FIRE25,
        new ThingStateLookup("FIRE", 25, "ArchvileFire"),// FIRE26,
        new ThingStateLookup("FIRE", 26, "ArchvileFire"),// FIRE27,
        new ThingStateLookup("FIRE", 27, "ArchvileFire"),// FIRE28,
        new ThingStateLookup("FIRE", 28, "ArchvileFire"),// FIRE29,
        new ThingStateLookup("FIRE", 29, "ArchvileFire"),// FIRE30,
        new ThingStateLookup("PUFF", 0, "RevenantTracerSmoke"),// SMOKE1,
        new ThingStateLookup("PUFF", 1, "RevenantTracerSmoke"),// SMOKE2,
        new ThingStateLookup("PUFF", 2, "RevenantTracerSmoke"),// SMOKE3,
        new ThingStateLookup("PUFF", 3, "RevenantTracerSmoke"),// SMOKE4,
        new ThingStateLookup("PUFF", 4, "RevenantTracerSmoke"),// SMOKE5,
        new ThingStateLookup("FATB", 0),                 // TRACER,
        new ThingStateLookup("FATB", 1),                 // TRACER2,
        new ThingStateLookup("FBXP", 0),                 // TRACEEXP1,
        new ThingStateLookup("FBXP", 1),                 // TRACEEXP2,
        new ThingStateLookup("FBXP", 2),                 // TRACEEXP3,
        new ThingStateLookup("SKEL", 0),                 // SKEL_STND,
        new ThingStateLookup("SKEL", 1),                 // SKEL_STND2,
        new ThingStateLookup("SKEL", 2),                 // SKEL_RUN1,
        new ThingStateLookup("SKEL", 3),                 // SKEL_RUN2,
        new ThingStateLookup("SKEL", 4),                 // SKEL_RUN3,
        new ThingStateLookup("SKEL", 5),                 // SKEL_RUN4,
        new ThingStateLookup("SKEL", 6),                 // SKEL_RUN5,
        new ThingStateLookup("SKEL", 7),                 // SKEL_RUN6,
        new ThingStateLookup("SKEL", 8),                 // SKEL_RUN7,
        new ThingStateLookup("SKEL", 9),                 // SKEL_RUN8,
        new ThingStateLookup("SKEL", 10),                // SKEL_RUN9,
        new ThingStateLookup("SKEL", 11),                // SKEL_RUN10,
        new ThingStateLookup("SKEL", 12),                // SKEL_RUN11,
        new ThingStateLookup("SKEL", 13),                // SKEL_RUN12,
        new ThingStateLookup("SKEL", 14),                // SKEL_FIST1,
        new ThingStateLookup("SKEL", 15),                // SKEL_FIST2,
        new ThingStateLookup("SKEL", 16),                // SKEL_FIST3,
        new ThingStateLookup("SKEL", 17),                // SKEL_FIST4,
        new ThingStateLookup("SKEL", 18),                // SKEL_MISS1,
        new ThingStateLookup("SKEL", 19),                // SKEL_MISS2,
        new ThingStateLookup("SKEL", 20),                // SKEL_MISS3,
        new ThingStateLookup("SKEL", 21),                // SKEL_MISS4,
        new ThingStateLookup("SKEL", 22),                // SKEL_PAIN,
        new ThingStateLookup("SKEL", 23),                // SKEL_PAIN2,
        new ThingStateLookup("SKEL", 24),                // SKEL_DIE1,
        new ThingStateLookup("SKEL", 25),                // SKEL_DIE2,
        new ThingStateLookup("SKEL", 26),                // SKEL_DIE3,
        new ThingStateLookup("SKEL", 27),                // SKEL_DIE4,
        new ThingStateLookup("SKEL", 28),                // SKEL_DIE5,
        new ThingStateLookup("SKEL", 29),                // SKEL_DIE6,
        new ThingStateLookup("SKEL", 30),                // SKEL_RAISE1,
        new ThingStateLookup("SKEL", 31),                // SKEL_RAISE2,
        new ThingStateLookup("SKEL", 32),                // SKEL_RAISE3,
        new ThingStateLookup("SKEL", 33),                // SKEL_RAISE4,
        new ThingStateLookup("SKEL", 34),                // SKEL_RAISE5,
        new ThingStateLookup("SKEL", 35),                // SKEL_RAISE6,
        new ThingStateLookup("MANF", 0),                 // FATSHOT1,
        new ThingStateLookup("MANF", 1),                 // FATSHOT2,
        new ThingStateLookup("MISL", 0, "FatShot"),      // FATSHOTX1,
        new ThingStateLookup("MISL", 1, "FatShot"),      // FATSHOTX2,
        new ThingStateLookup("MISL", 2, "FatShot"),      // FATSHOTX3,
        new ThingStateLookup("FATT", 0),                 // FATT_STND,
        new ThingStateLookup("FATT", 1),                 // FATT_STND2,
        new ThingStateLookup("FATT", 2),                 // FATT_RUN1,
        new ThingStateLookup("FATT", 3),                 // FATT_RUN2,
        new ThingStateLookup("FATT", 4),                 // FATT_RUN3,
        new ThingStateLookup("FATT", 5),                 // FATT_RUN4,
        new ThingStateLookup("FATT", 6),                 // FATT_RUN5,
        new ThingStateLookup("FATT", 7),                 // FATT_RUN6,
        new ThingStateLookup("FATT", 8),                 // FATT_RUN7,
        new ThingStateLookup("FATT", 9),                 // FATT_RUN8,
        new ThingStateLookup("FATT", 10),                // FATT_RUN9,
        new ThingStateLookup("FATT", 11),                // FATT_RUN10,
        new ThingStateLookup("FATT", 12),                // FATT_RUN11,
        new ThingStateLookup("FATT", 13),                // FATT_RUN12,
        new ThingStateLookup("FATT", 14),                // FATT_ATK1,
        new ThingStateLookup("FATT", 15),                // FATT_ATK2,
        new ThingStateLookup("FATT", 16),                // FATT_ATK3,
        new ThingStateLookup("FATT", 17),                // FATT_ATK4,
        new ThingStateLookup("FATT", 18),                // FATT_ATK5,
        new ThingStateLookup("FATT", 19),                // FATT_ATK6,
        new ThingStateLookup("FATT", 20),                // FATT_ATK7,
        new ThingStateLookup("FATT", 21),                // FATT_ATK8,
        new ThingStateLookup("FATT", 22),                // FATT_ATK9,
        new ThingStateLookup("FATT", 23),                // FATT_ATK10,
        new ThingStateLookup("FATT", 24),                // FATT_PAIN,
        new ThingStateLookup("FATT", 25),                // FATT_PAIN2,
        new ThingStateLookup("FATT", 26),                // FATT_DIE1,
        new ThingStateLookup("FATT", 27),                // FATT_DIE2,
        new ThingStateLookup("FATT", 28),                // FATT_DIE3,
        new ThingStateLookup("FATT", 29),                // FATT_DIE4,
        new ThingStateLookup("FATT", 30),                // FATT_DIE5,
        new ThingStateLookup("FATT", 31),                // FATT_DIE6,
        new ThingStateLookup("FATT", 32),                // FATT_DIE7,
        new ThingStateLookup("FATT", 33),                // FATT_DIE8,
        new ThingStateLookup("FATT", 34),                // FATT_DIE9,
        new ThingStateLookup("FATT", 35),                // FATT_DIE10,
        new ThingStateLookup("FATT", 36),                // FATT_RAISE1,
        new ThingStateLookup("FATT", 37),                // FATT_RAISE2,
        new ThingStateLookup("FATT", 38),                // FATT_RAISE3,
        new ThingStateLookup("FATT", 39),                // FATT_RAISE4,
        new ThingStateLookup("FATT", 40),                // FATT_RAISE5,
        new ThingStateLookup("FATT", 41),                // FATT_RAISE6,
        new ThingStateLookup("FATT", 42),                // FATT_RAISE7,
        new ThingStateLookup("FATT", 43),                // FATT_RAISE8,
        new ThingStateLookup("CPOS", 0),                 // CPOS_STND,
        new ThingStateLookup("CPOS", 1),                 // CPOS_STND2,
        new ThingStateLookup("CPOS", 2),                 // CPOS_RUN1,
        new ThingStateLookup("CPOS", 3),                 // CPOS_RUN2,
        new ThingStateLookup("CPOS", 4),                 // CPOS_RUN3,
        new ThingStateLookup("CPOS", 5),                 // CPOS_RUN4,
        new ThingStateLookup("CPOS", 6),                 // CPOS_RUN5,
        new ThingStateLookup("CPOS", 7),                 // CPOS_RUN6,
        new ThingStateLookup("CPOS", 8),                 // CPOS_RUN7,
        new ThingStateLookup("CPOS", 9),                 // CPOS_RUN8,
        new ThingStateLookup("CPOS", 10),                // CPOS_ATK1,
        new ThingStateLookup("CPOS", 11),                // CPOS_ATK2,
        new ThingStateLookup("CPOS", 12),                // CPOS_ATK3,
        new ThingStateLookup("CPOS", 13),                // CPOS_ATK4,
        new ThingStateLookup("CPOS", 14),                // CPOS_PAIN,
        new ThingStateLookup("CPOS", 15),                // CPOS_PAIN2,
        new ThingStateLookup("CPOS", 16),                // CPOS_DIE1,
        new ThingStateLookup("CPOS", 17),                // CPOS_DIE2,
        new ThingStateLookup("CPOS", 18),                // CPOS_DIE3,
        new ThingStateLookup("CPOS", 19),                // CPOS_DIE4,
        new ThingStateLookup("CPOS", 20),                // CPOS_DIE5,
        new ThingStateLookup("CPOS", 21),                // CPOS_DIE6,
        new ThingStateLookup("CPOS", 22),                // CPOS_DIE7,
        new ThingStateLookup("CPOS", 23),                // CPOS_XDIE1,
        new ThingStateLookup("CPOS", 24),                // CPOS_XDIE2,
        new ThingStateLookup("CPOS", 25),                // CPOS_XDIE3,
        new ThingStateLookup("CPOS", 26),                // CPOS_XDIE4,
        new ThingStateLookup("CPOS", 27),                // CPOS_XDIE5,
        new ThingStateLookup("CPOS", 28),                // CPOS_XDIE6,
        new ThingStateLookup("CPOS", 29),                // CPOS_RAISE1,
        new ThingStateLookup("CPOS", 30),                // CPOS_RAISE2,
        new ThingStateLookup("CPOS", 31),                // CPOS_RAISE3,
        new ThingStateLookup("CPOS", 32),                // CPOS_RAISE4,
        new ThingStateLookup("CPOS", 33),                // CPOS_RAISE5,
        new ThingStateLookup("CPOS", 34),                // CPOS_RAISE6,
        new ThingStateLookup("CPOS", 35),                // CPOS_RAISE7,
        new ThingStateLookup("TROO", 0),                 // TROO_STND,
        new ThingStateLookup("TROO", 1),                 // TROO_STND2,
        new ThingStateLookup("TROO", 2),                 // TROO_RUN1,
        new ThingStateLookup("TROO", 3),                 // TROO_RUN2,
        new ThingStateLookup("TROO", 4),                 // TROO_RUN3,
        new ThingStateLookup("TROO", 5),                 // TROO_RUN4,
        new ThingStateLookup("TROO", 6),                 // TROO_RUN5,
        new ThingStateLookup("TROO", 7),                 // TROO_RUN6,
        new ThingStateLookup("TROO", 8),                 // TROO_RUN7,
        new ThingStateLookup("TROO", 9),                 // TROO_RUN8,
        new ThingStateLookup("TROO", 10),                // TROO_ATK1,
        new ThingStateLookup("TROO", 11),                // TROO_ATK2,
        new ThingStateLookup("TROO", 12),                // TROO_ATK3,
        new ThingStateLookup("TROO", 13),                // TROO_PAIN,
        new ThingStateLookup("TROO", 14),                // TROO_PAIN2,
        new ThingStateLookup("TROO", 15),                // TROO_DIE1,
        new ThingStateLookup("TROO", 16),                // TROO_DIE2,
        new ThingStateLookup("TROO", 17),                // TROO_DIE3,
        new ThingStateLookup("TROO", 18),                // TROO_DIE4,
        new ThingStateLookup("TROO", 19),                // TROO_DIE5,
        new ThingStateLookup("TROO", 20),                // TROO_XDIE1,
        new ThingStateLookup("TROO", 21),                // TROO_XDIE2,
        new ThingStateLookup("TROO", 22),                // TROO_XDIE3,
        new ThingStateLookup("TROO", 23),                // TROO_XDIE4,
        new ThingStateLookup("TROO", 24),                // TROO_XDIE5,
        new ThingStateLookup("TROO", 25),                // TROO_XDIE6,
        new ThingStateLookup("TROO", 26),                // TROO_XDIE7,
        new ThingStateLookup("TROO", 27),                // TROO_XDIE8,
        new ThingStateLookup("TROO", 28),                // TROO_RAISE1,
        new ThingStateLookup("TROO", 29),                // TROO_RAISE2,
        new ThingStateLookup("TROO", 30),                // TROO_RAISE3,
        new ThingStateLookup("TROO", 31),                // TROO_RAISE4,
        new ThingStateLookup("TROO", 32),                // TROO_RAISE5,
        new ThingStateLookup("SARG", 0),                 // SARG_STND,
        new ThingStateLookup("SARG", 1),                 // SARG_STND2,
        new ThingStateLookup("SARG", 2),                 // SARG_RUN1,
        new ThingStateLookup("SARG", 3),                 // SARG_RUN2,
        new ThingStateLookup("SARG", 4),                 // SARG_RUN3,
        new ThingStateLookup("SARG", 5),                 // SARG_RUN4,
        new ThingStateLookup("SARG", 6),                 // SARG_RUN5,
        new ThingStateLookup("SARG", 7),                 // SARG_RUN6,
        new ThingStateLookup("SARG", 8),                 // SARG_RUN7,
        new ThingStateLookup("SARG", 9),                 // SARG_RUN8,
        new ThingStateLookup("SARG", 10),                // SARG_ATK1,
        new ThingStateLookup("SARG", 11),                // SARG_ATK2,
        new ThingStateLookup("SARG", 12),                // SARG_ATK3,
        new ThingStateLookup("SARG", 13),                // SARG_PAIN,
        new ThingStateLookup("SARG", 14),                // SARG_PAIN2,
        new ThingStateLookup("SARG", 15),                // SARG_DIE1,
        new ThingStateLookup("SARG", 16),                // SARG_DIE2,
        new ThingStateLookup("SARG", 17),                // SARG_DIE3,
        new ThingStateLookup("SARG", 18),                // SARG_DIE4,
        new ThingStateLookup("SARG", 19),                // SARG_DIE5,
        new ThingStateLookup("SARG", 20),                // SARG_DIE6,
        new ThingStateLookup("SARG", 21),                // SARG_RAISE1,
        new ThingStateLookup("SARG", 22),                // SARG_RAISE2,
        new ThingStateLookup("SARG", 23),                // SARG_RAISE3,
        new ThingStateLookup("SARG", 24),                // SARG_RAISE4,
        new ThingStateLookup("SARG", 25),                // SARG_RAISE5,
        new ThingStateLookup("SARG", 26),                // SARG_RAISE6,
        new ThingStateLookup("HEAD", 0),                 // HEAD_STND,
        new ThingStateLookup("HEAD", 1),                 // HEAD_RUN1,
        new ThingStateLookup("HEAD", 2),                 // HEAD_ATK1,
        new ThingStateLookup("HEAD", 3),                 // HEAD_ATK2,
        new ThingStateLookup("HEAD", 4),                 // HEAD_ATK3,
        new ThingStateLookup("HEAD", 5),                 // HEAD_PAIN,
        new ThingStateLookup("HEAD", 6),                 // HEAD_PAIN2,
        new ThingStateLookup("HEAD", 7),                 // HEAD_PAIN3,
        new ThingStateLookup("HEAD", 8),                 // HEAD_DIE1,
        new ThingStateLookup("HEAD", 9),                 // HEAD_DIE2,
        new ThingStateLookup("HEAD", 10),                // HEAD_DIE3,
        new ThingStateLookup("HEAD", 11),                // HEAD_DIE4,
        new ThingStateLookup("HEAD", 12),                // HEAD_DIE5,
        new ThingStateLookup("HEAD", 13),                // HEAD_DIE6,
        new ThingStateLookup("HEAD", 14),                // HEAD_RAISE1,
        new ThingStateLookup("HEAD", 15),                // HEAD_RAISE2,
        new ThingStateLookup("HEAD", 16),                // HEAD_RAISE3,
        new ThingStateLookup("HEAD", 17),                // HEAD_RAISE4,
        new ThingStateLookup("HEAD", 18),                // HEAD_RAISE5,
        new ThingStateLookup("HEAD", 19),                // HEAD_RAISE6,
        new ThingStateLookup("BAL7", 0),                 // BRBALL1,
        new ThingStateLookup("BAL7", 1),                 // BRBALL2,
        new ThingStateLookup("BAL7", 2),                 // BRBALLX1,
        new ThingStateLookup("BAL7", 3),                 // BRBALLX2,
        new ThingStateLookup("BAL7", 4),                 // BRBALLX3,
        new ThingStateLookup("BOSS", 0),                 // BOSS_STND,
        new ThingStateLookup("BOSS", 1),                 // BOSS_STND2,
        new ThingStateLookup("BOSS", 2),                 // BOSS_RUN1,
        new ThingStateLookup("BOSS", 3),                 // BOSS_RUN2,
        new ThingStateLookup("BOSS", 4),                 // BOSS_RUN3,
        new ThingStateLookup("BOSS", 5),                 // BOSS_RUN4,
        new ThingStateLookup("BOSS", 6),                 // BOSS_RUN5,
        new ThingStateLookup("BOSS", 7),                 // BOSS_RUN6,
        new ThingStateLookup("BOSS", 8),                 // BOSS_RUN7,
        new ThingStateLookup("BOSS", 9),                 // BOSS_RUN8,
        new ThingStateLookup("BOSS", 10),                // BOSS_ATK1,
        new ThingStateLookup("BOSS", 11),                // BOSS_ATK2,
        new ThingStateLookup("BOSS", 12),                // BOSS_ATK3,
        new ThingStateLookup("BOSS", 13),                // BOSS_PAIN,
        new ThingStateLookup("BOSS", 14),                // BOSS_PAIN2,
        new ThingStateLookup("BOSS", 15),                // BOSS_DIE1,
        new ThingStateLookup("BOSS", 16),                // BOSS_DIE2,
        new ThingStateLookup("BOSS", 17),                // BOSS_DIE3,
        new ThingStateLookup("BOSS", 18),                // BOSS_DIE4,
        new ThingStateLookup("BOSS", 19),                // BOSS_DIE5,
        new ThingStateLookup("BOSS", 20),                // BOSS_DIE6,
        new ThingStateLookup("BOSS", 21),                // BOSS_DIE7,
        new ThingStateLookup("BOSS", 22),                // BOSS_RAISE1,
        new ThingStateLookup("BOSS", 23),                // BOSS_RAISE2,
        new ThingStateLookup("BOSS", 24),                // BOSS_RAISE3,
        new ThingStateLookup("BOSS", 25),                // BOSS_RAISE4,
        new ThingStateLookup("BOSS", 26),                // BOSS_RAISE5,
        new ThingStateLookup("BOSS", 27),                // BOSS_RAISE6,
        new ThingStateLookup("BOSS", 28),                // BOSS_RAISE7,
        new ThingStateLookup("BOS2", 0),                 // BOS2_STND,
        new ThingStateLookup("BOS2", 1),                 // BOS2_STND2,
        new ThingStateLookup("BOS2", 2),                 // BOS2_RUN1,
        new ThingStateLookup("BOS2", 3),                 // BOS2_RUN2,
        new ThingStateLookup("BOS2", 4),                 // BOS2_RUN3,
        new ThingStateLookup("BOS2", 5),                 // BOS2_RUN4,
        new ThingStateLookup("BOS2", 6),                 // BOS2_RUN5,
        new ThingStateLookup("BOS2", 7),                 // BOS2_RUN6,
        new ThingStateLookup("BOS2", 8),                 // BOS2_RUN7,
        new ThingStateLookup("BOS2", 9),                 // BOS2_RUN8,
        new ThingStateLookup("BOS2", 10),                // BOS2_ATK1,
        new ThingStateLookup("BOS2", 11),                // BOS2_ATK2,
        new ThingStateLookup("BOS2", 12),                // BOS2_ATK3,
        new ThingStateLookup("BOS2", 13),                // BOS2_PAIN,
        new ThingStateLookup("BOS2", 14),                // BOS2_PAIN2,
        new ThingStateLookup("BOS2", 15),                // BOS2_DIE1,
        new ThingStateLookup("BOS2", 16),                // BOS2_DIE2,
        new ThingStateLookup("BOS2", 17),                // BOS2_DIE3,
        new ThingStateLookup("BOS2", 18),                // BOS2_DIE4,
        new ThingStateLookup("BOS2", 19),                // BOS2_DIE5,
        new ThingStateLookup("BOS2", 20),                // BOS2_DIE6,
        new ThingStateLookup("BOS2", 21),                // BOS2_DIE7,
        new ThingStateLookup("BOS2", 22),                // BOS2_RAISE1,
        new ThingStateLookup("BOS2", 23),                // BOS2_RAISE2,
        new ThingStateLookup("BOS2", 24),                // BOS2_RAISE3,
        new ThingStateLookup("BOS2", 25),                // BOS2_RAISE4,
        new ThingStateLookup("BOS2", 26),                // BOS2_RAISE5,
        new ThingStateLookup("BOS2", 27),                // BOS2_RAISE6,
        new ThingStateLookup("BOS2", 28),                // BOS2_RAISE7,
        new ThingStateLookup("SKUL", 0),                 // SKULL_STND,
        new ThingStateLookup("SKUL", 1),                 // SKULL_STND2,
        new ThingStateLookup("SKUL", 2),                 // SKULL_RUN1,
        new ThingStateLookup("SKUL", 3),                 // SKULL_RUN2,
        new ThingStateLookup("SKUL", 4),                 // SKULL_ATK1,
        new ThingStateLookup("SKUL", 5),                 // SKULL_ATK2,
        new ThingStateLookup("SKUL", 6),                 // SKULL_ATK3,
        new ThingStateLookup("SKUL", 7),                 // SKULL_ATK4,
        new ThingStateLookup("SKUL", 8),                 // SKULL_PAIN,
        new ThingStateLookup("SKUL", 9),                 // SKULL_PAIN2,
        new ThingStateLookup("SKUL", 10),                // SKULL_DIE1,
        new ThingStateLookup("SKUL", 11),                // SKULL_DIE2,
        new ThingStateLookup("SKUL", 12),                // SKULL_DIE3,
        new ThingStateLookup("SKUL", 13),                // SKULL_DIE4,
        new ThingStateLookup("SKUL", 14),                // SKULL_DIE5,
        new ThingStateLookup("SKUL", 15),                // SKULL_DIE6,
        new ThingStateLookup("SPID", 0),                 // SPID_STND,
        new ThingStateLookup("SPID", 1),                 // SPID_STND2,
        new ThingStateLookup("SPID", 2),                 // SPID_RUN1,
        new ThingStateLookup("SPID", 3),                 // SPID_RUN2,
        new ThingStateLookup("SPID", 4),                 // SPID_RUN3,
        new ThingStateLookup("SPID", 5),                 // SPID_RUN4,
        new ThingStateLookup("SPID", 6),                 // SPID_RUN5,
        new ThingStateLookup("SPID", 7),                 // SPID_RUN6,
        new ThingStateLookup("SPID", 8),                 // SPID_RUN7,
        new ThingStateLookup("SPID", 9),                 // SPID_RUN8,
        new ThingStateLookup("SPID", 10),                // SPID_RUN9,
        new ThingStateLookup("SPID", 11),                // SPID_RUN10,
        new ThingStateLookup("SPID", 12),                // SPID_RUN11,
        new ThingStateLookup("SPID", 13),                // SPID_RUN12,
        new ThingStateLookup("SPID", 14),                // SPID_ATK1,
        new ThingStateLookup("SPID", 15),                // SPID_ATK2,
        new ThingStateLookup("SPID", 16),                // SPID_ATK3,
        new ThingStateLookup("SPID", 17),                // SPID_ATK4,
        new ThingStateLookup("SPID", 18),                // SPID_PAIN,
        new ThingStateLookup("SPID", 19),                // SPID_PAIN2,
        new ThingStateLookup("SPID", 20),                // SPID_DIE1,
        new ThingStateLookup("SPID", 21),                // SPID_DIE2,
        new ThingStateLookup("SPID", 22),                // SPID_DIE3,
        new ThingStateLookup("SPID", 23),                // SPID_DIE4,
        new ThingStateLookup("SPID", 24),                // SPID_DIE5,
        new ThingStateLookup("SPID", 25),                // SPID_DIE6,
        new ThingStateLookup("SPID", 26),                // SPID_DIE7,
        new ThingStateLookup("SPID", 27),                // SPID_DIE8,
        new ThingStateLookup("SPID", 28),                // SPID_DIE9,
        new ThingStateLookup("SPID", 29),                // SPID_DIE10,
        new ThingStateLookup("SPID", 30),                // SPID_DIE11,
        new ThingStateLookup("BSPI", 0),                 // BSPI_STND,
        new ThingStateLookup("BSPI", 1),                 // BSPI_STND2,
        new ThingStateLookup("BSPI", 2),                 // BSPI_SIGHT,
        new ThingStateLookup("BSPI", 3),                 // BSPI_RUN1,
        new ThingStateLookup("BSPI", 4),                 // BSPI_RUN2,
        new ThingStateLookup("BSPI", 5),                 // BSPI_RUN3,
        new ThingStateLookup("BSPI", 6),                 // BSPI_RUN4,
        new ThingStateLookup("BSPI", 7),                 // BSPI_RUN5,
        new ThingStateLookup("BSPI", 8),                 // BSPI_RUN6,
        new ThingStateLookup("BSPI", 9),                 // BSPI_RUN7,
        new ThingStateLookup("BSPI", 10),                // BSPI_RUN8,
        new ThingStateLookup("BSPI", 11),                // BSPI_RUN9,
        new ThingStateLookup("BSPI", 12),                // BSPI_RUN10,
        new ThingStateLookup("BSPI", 13),                // BSPI_RUN11,
        new ThingStateLookup("BSPI", 14),                // BSPI_RUN12,
        new ThingStateLookup("BSPI", 15),                // BSPI_ATK1,
        new ThingStateLookup("BSPI", 16),                // BSPI_ATK2,
        new ThingStateLookup("BSPI", 17),                // BSPI_ATK3,
        new ThingStateLookup("BSPI", 18),                // BSPI_ATK4,
        new ThingStateLookup("BSPI", 19),                // BSPI_PAIN,
        new ThingStateLookup("BSPI", 20),                // BSPI_PAIN2,
        new ThingStateLookup("BSPI", 21),                // BSPI_DIE1,
        new ThingStateLookup("BSPI", 22),                // BSPI_DIE2,
        new ThingStateLookup("BSPI", 23),                // BSPI_DIE3,
        new ThingStateLookup("BSPI", 24),                // BSPI_DIE4,
        new ThingStateLookup("BSPI", 25),                // BSPI_DIE5,
        new ThingStateLookup("BSPI", 26),                // BSPI_DIE6,
        new ThingStateLookup("BSPI", 27),                // BSPI_DIE7,
        new ThingStateLookup("BSPI", 28),                // BSPI_RAISE1,
        new ThingStateLookup("BSPI", 29),                // BSPI_RAISE2,
        new ThingStateLookup("BSPI", 30),                // BSPI_RAISE3,
        new ThingStateLookup("BSPI", 31),                // BSPI_RAISE4,
        new ThingStateLookup("BSPI", 32),                // BSPI_RAISE5,
        new ThingStateLookup("BSPI", 33),                // BSPI_RAISE6,
        new ThingStateLookup("BSPI", 34),                // BSPI_RAISE7,
        new ThingStateLookup("APLS", 0),                 // ARACH_PLAZ,
        new ThingStateLookup("APLS", 1),                 // ARACH_PLAZ2,
        new ThingStateLookup("APBX", 0),                 // ARACH_PLEX,
        new ThingStateLookup("APBX", 1),                 // ARACH_PLEX2,
        new ThingStateLookup("APBX", 2),                 // ARACH_PLEX3,
        new ThingStateLookup("APBX", 3),                 // ARACH_PLEX4,
        new ThingStateLookup("APBX", 4),                 // ARACH_PLEX5,
        new ThingStateLookup("CYBR", 0),                 // CYBER_STND,
        new ThingStateLookup("CYBR", 1),                 // CYBER_STND2,
        new ThingStateLookup("CYBR", 2),                 // CYBER_RUN1,
        new ThingStateLookup("CYBR", 3),                 // CYBER_RUN2,
        new ThingStateLookup("CYBR", 4),                 // CYBER_RUN3,
        new ThingStateLookup("CYBR", 5),                 // CYBER_RUN4,
        new ThingStateLookup("CYBR", 6),                 // CYBER_RUN5,
        new ThingStateLookup("CYBR", 7),                 // CYBER_RUN6,
        new ThingStateLookup("CYBR", 8),                 // CYBER_RUN7,
        new ThingStateLookup("CYBR", 9),                 // CYBER_RUN8,
        new ThingStateLookup("CYBR", 10),                // CYBER_ATK1,
        new ThingStateLookup("CYBR", 11),                // CYBER_ATK2,
        new ThingStateLookup("CYBR", 12),                // CYBER_ATK3,
        new ThingStateLookup("CYBR", 13),                // CYBER_ATK4,
        new ThingStateLookup("CYBR", 14),                // CYBER_ATK5,
        new ThingStateLookup("CYBR", 15),                // CYBER_ATK6,
        new ThingStateLookup("CYBR", 16),                // CYBER_PAIN,
        new ThingStateLookup("CYBR", 17),                // CYBER_DIE1,
        new ThingStateLookup("CYBR", 18),                // CYBER_DIE2,
        new ThingStateLookup("CYBR", 19),                // CYBER_DIE3,
        new ThingStateLookup("CYBR", 20),                // CYBER_DIE4,
        new ThingStateLookup("CYBR", 21),                // CYBER_DIE5,
        new ThingStateLookup("CYBR", 22),                // CYBER_DIE6,
        new ThingStateLookup("CYBR", 23),                // CYBER_DIE7,
        new ThingStateLookup("CYBR", 24),                // CYBER_DIE8,
        new ThingStateLookup("CYBR", 25),                // CYBER_DIE9,
        new ThingStateLookup("CYBR", 26),                // CYBER_DIE10,
        new ThingStateLookup("PAIN", 0),                 // PAIN_STND,
        new ThingStateLookup("PAIN", 1),                 // PAIN_RUN1,
        new ThingStateLookup("PAIN", 2),                 // PAIN_RUN2,
        new ThingStateLookup("PAIN", 3),                 // PAIN_RUN3,
        new ThingStateLookup("PAIN", 4),                 // PAIN_RUN4,
        new ThingStateLookup("PAIN", 5),                 // PAIN_RUN5,
        new ThingStateLookup("PAIN", 6),                 // PAIN_RUN6,
        new ThingStateLookup("PAIN", 7),                 // PAIN_ATK1,
        new ThingStateLookup("PAIN", 8),                 // PAIN_ATK2,
        new ThingStateLookup("PAIN", 9),                 // PAIN_ATK3,
        new ThingStateLookup("PAIN", 10),                // PAIN_ATK4,
        new ThingStateLookup("PAIN", 11),                // PAIN_PAIN,
        new ThingStateLookup("PAIN", 12),                // PAIN_PAIN2,
        new ThingStateLookup("PAIN", 13),                // PAIN_DIE1,
        new ThingStateLookup("PAIN", 14),                // PAIN_DIE2,
        new ThingStateLookup("PAIN", 15),                // PAIN_DIE3,
        new ThingStateLookup("PAIN", 16),                // PAIN_DIE4,
        new ThingStateLookup("PAIN", 17),                // PAIN_DIE5,
        new ThingStateLookup("PAIN", 18),                // PAIN_DIE6,
        new ThingStateLookup("PAIN", 19),                // PAIN_RAISE1,
        new ThingStateLookup("PAIN", 20),                // PAIN_RAISE2,
        new ThingStateLookup("PAIN", 21),                // PAIN_RAISE3,
        new ThingStateLookup("PAIN", 22),                // PAIN_RAISE4,
        new ThingStateLookup("PAIN", 23),                // PAIN_RAISE5,
        new ThingStateLookup("PAIN", 24),                // PAIN_RAISE6,
        new ThingStateLookup("SSWV", 0, "WolfensteinSS"), // SSWV_STND,
        new ThingStateLookup("SSWV", 1, "WolfensteinSS"), // SSWV_STND2,
        new ThingStateLookup("SSWV", 2, "WolfensteinSS"), // SSWV_RUN1,
        new ThingStateLookup("SSWV", 3, "WolfensteinSS"), // SSWV_RUN2,
        new ThingStateLookup("SSWV", 4, "WolfensteinSS"), // SSWV_RUN3,
        new ThingStateLookup("SSWV", 5, "WolfensteinSS"), // SSWV_RUN4,
        new ThingStateLookup("SSWV", 6, "WolfensteinSS"), // SSWV_RUN5,
        new ThingStateLookup("SSWV", 7, "WolfensteinSS"), // SSWV_RUN6,
        new ThingStateLookup("SSWV", 8, "WolfensteinSS"), // SSWV_RUN7,
        new ThingStateLookup("SSWV", 9, "WolfensteinSS"), // SSWV_RUN8,
        new ThingStateLookup("SSWV", 10, "WolfensteinSS"),// SSWV_ATK1,
        new ThingStateLookup("SSWV", 11, "WolfensteinSS"),// SSWV_ATK2,
        new ThingStateLookup("SSWV", 12, "WolfensteinSS"),// SSWV_ATK3,
        new ThingStateLookup("SSWV", 13, "WolfensteinSS"),// SSWV_ATK4,
        new ThingStateLookup("SSWV", 14, "WolfensteinSS"),// SSWV_ATK5,
        new ThingStateLookup("SSWV", 15, "WolfensteinSS"),// SSWV_ATK6,
        new ThingStateLookup("SSWV", 16, "WolfensteinSS"),// SSWV_PAIN,
        new ThingStateLookup("SSWV", 17, "WolfensteinSS"),// SSWV_PAIN2,
        new ThingStateLookup("SSWV", 18, "WolfensteinSS"),// SSWV_DIE1,
        new ThingStateLookup("SSWV", 19, "WolfensteinSS"),// SSWV_DIE2,
        new ThingStateLookup("SSWV", 20, "WolfensteinSS"),// SSWV_DIE3,
        new ThingStateLookup("SSWV", 21, "WolfensteinSS"),// SSWV_DIE4,
        new ThingStateLookup("SSWV", 22, "WolfensteinSS"),// SSWV_DIE5,
        new ThingStateLookup("SSWV", 23, "WolfensteinSS"),// SSWV_XDIE1,
        new ThingStateLookup("SSWV", 24, "WolfensteinSS"),// SSWV_XDIE2,
        new ThingStateLookup("SSWV", 25, "WolfensteinSS"),// SSWV_XDIE3,
        new ThingStateLookup("SSWV", 26, "WolfensteinSS"),// SSWV_XDIE4,
        new ThingStateLookup("SSWV", 27, "WolfensteinSS"),// SSWV_XDIE5,
        new ThingStateLookup("SSWV", 28, "WolfensteinSS"),// SSWV_XDIE6,
        new ThingStateLookup("SSWV", 29, "WolfensteinSS"),// SSWV_XDIE7,
        new ThingStateLookup("SSWV", 30, "WolfensteinSS"),// SSWV_XDIE8,
        new ThingStateLookup("SSWV", 31, "WolfensteinSS"),// SSWV_XDIE9,
        new ThingStateLookup("SSWV", 32, "WolfensteinSS"),// SSWV_RAISE1,
        new ThingStateLookup("SSWV", 33, "WolfensteinSS"),// SSWV_RAISE2,
        new ThingStateLookup("SSWV", 34, "WolfensteinSS"),// SSWV_RAISE3,
        new ThingStateLookup("SSWV", 35, "WolfensteinSS"),// SSWV_RAISE4,
        new ThingStateLookup("SSWV", 36, "WolfensteinSS"),// SSWV_RAISE5,
        new ThingStateLookup("KEEN", 0),                 // KEENSTND,
        new ThingStateLookup("KEEN", 1),                 // COMMKEEN,
        new ThingStateLookup("KEEN", 2),                 // COMMKEEN2,
        new ThingStateLookup("KEEN", 3),                 // COMMKEEN3,
        new ThingStateLookup("KEEN", 4),                 // COMMKEEN4,
        new ThingStateLookup("KEEN", 5),                 // COMMKEEN5,
        new ThingStateLookup("KEEN", 6),                 // COMMKEEN6,
        new ThingStateLookup("KEEN", 7),                 // COMMKEEN7,
        new ThingStateLookup("KEEN", 8),                 // COMMKEEN8,
        new ThingStateLookup("KEEN", 9),                 // COMMKEEN9,
        new ThingStateLookup("KEEN", 10),                // COMMKEEN10,
        new ThingStateLookup("KEEN", 11),                // COMMKEEN11,
        new ThingStateLookup("KEEN", 12),                // COMMKEEN12,
        new ThingStateLookup("KEEN", 13),                // KEENPAIN,
        new ThingStateLookup("KEEN", 14),                // KEENPAIN2,
        new ThingStateLookup("BBRN", 0),                 // BRAIN,
        new ThingStateLookup("BBRN", 1),                 // BRAIN_PAIN,
        new ThingStateLookup("BBRN", 2),                 // BRAIN_DIE1,
        new ThingStateLookup("BBRN", 3),                 // BRAIN_DIE2,
        new ThingStateLookup("BBRN", 4),                 // BRAIN_DIE3,
        new ThingStateLookup("BBRN", 5),                 // BRAIN_DIE4,
        new ThingStateLookup("SSWV", 0, "BossEye"),      // BRAINEYE,
        new ThingStateLookup("SSWV", 1, "BossEye"),      // BRAINEYESEE,
        new ThingStateLookup("SSWV", 2, "BossEye"),      // BRAINEYE1,
        new ThingStateLookup("BOSF", 0),                 // SPAWN1,
        new ThingStateLookup("BOSF", 1),                 // SPAWN2,
        new ThingStateLookup("BOSF", 2),                 // SPAWN3,
        new ThingStateLookup("BOSF", 3),                 // SPAWN4,
        new ThingStateLookup("FIRE", 0, "SpawnFire"),    // SPAWNFIRE1,
        new ThingStateLookup("FIRE", 1, "SpawnFire"),    // SPAWNFIRE2,
        new ThingStateLookup("FIRE", 2, "SpawnFire"),    // SPAWNFIRE3,
        new ThingStateLookup("FIRE", 3, "SpawnFire"),    // SPAWNFIRE4,
        new ThingStateLookup("FIRE", 4, "SpawnFire"),    // SPAWNFIRE5,
        new ThingStateLookup("FIRE", 5, "SpawnFire"),    // SPAWNFIRE6,
        new ThingStateLookup("FIRE", 6, "SpawnFire"),    // SPAWNFIRE7,
        new ThingStateLookup("FIRE", 7, "SpawnFire"),    // SPAWNFIRE8,
        new ThingStateLookup("MISL", 0, "BossRocket"),   // BRAINEXPLODE1,
        new ThingStateLookup("MISL", 1, "BossRocket"),   // BRAINEXPLODE2,
        new ThingStateLookup("MISL", 2, "BossRocket"),   // BRAINEXPLODE3,
        new ThingStateLookup("ARM1", 0),                 // ARM1,
        new ThingStateLookup("ARM1", 1),                 // ARM1A,
        new ThingStateLookup("ARM2", 0),                 // ARM2,
        new ThingStateLookup("ARM2", 1),                 // ARM2A,
        new ThingStateLookup("BAR1", 0),                 // BAR1,
        new ThingStateLookup("BAR1", 1),                 // BAR2,
        new ThingStateLookup("BEXP", 0),                 // BEXP,
        new ThingStateLookup("BEXP", 1),                 // BEXP2,
        new ThingStateLookup("BEXP", 2),                 // BEXP3,
        new ThingStateLookup("BEXP", 3),                 // BEXP4,
        new ThingStateLookup("BEXP", 4),                 // BEXP5,
        new ThingStateLookup("FCAN", 0),                 // BBAR1,
        new ThingStateLookup("FCAN", 1),                 // BBAR2,
        new ThingStateLookup("FCAN", 2),                 // BBAR3,
        new ThingStateLookup("BON1", 0),                 // BON1,
        new ThingStateLookup("BON1", 1),                 // BON1A,
        new ThingStateLookup("BON1", 2),                 // BON1B,
        new ThingStateLookup("BON1", 3),                 // BON1C,
        new ThingStateLookup("BON1", 4),                 // BON1D,
        new ThingStateLookup("BON1", 5),                 // BON1E,
        new ThingStateLookup("BON2", 0),                 // BON2,
        new ThingStateLookup("BON2", 1),                 // BON2A,
        new ThingStateLookup("BON2", 2),                 // BON2B,
        new ThingStateLookup("BON2", 3),                 // BON2C,
        new ThingStateLookup("BON2", 4),                 // BON2D,
        new ThingStateLookup("BON2", 5),                 // BON2E,
        new ThingStateLookup("BKEY", 0),                 // BKEY,
        new ThingStateLookup("BKEY", 1),                 // BKEY2,
        new ThingStateLookup("RKEY", 0),                 // RKEY,
        new ThingStateLookup("RKEY", 1),                 // RKEY2,
        new ThingStateLookup("YKEY", 0),                 // YKEY,
        new ThingStateLookup("YKEY", 1),                 // YKEY2,
        new ThingStateLookup("BSKU", 0),                 // BSKULL,
        new ThingStateLookup("BSKU", 1),                 // BSKULL2,
        new ThingStateLookup("RSKU", 0),                 // RSKULL,
        new ThingStateLookup("RSKU", 1),                 // RSKULL2,
        new ThingStateLookup("YSKU", 0),                 // YSKULL,
        new ThingStateLookup("YSKU", 1),                 // YSKULL2,
        new ThingStateLookup("STIM", 0),                 // STIM,
        new ThingStateLookup("MEDI", 0),                 // MEDI,
        new ThingStateLookup("SOUL", 0),                 // SOUL,
        new ThingStateLookup("SOUL", 1),                 // SOUL2,
        new ThingStateLookup("SOUL", 2),                 // SOUL3,
        new ThingStateLookup("SOUL", 3),                 // SOUL4,
        new ThingStateLookup("SOUL", 4),                 // SOUL5,
        new ThingStateLookup("SOUL", 5),                 // SOUL6,
        new ThingStateLookup("PINV", 0),                 // PINV,
        new ThingStateLookup("PINV", 1),                 // PINV2,
        new ThingStateLookup("PINV", 2),                 // PINV3,
        new ThingStateLookup("PINV", 3),                 // PINV4,
        new ThingStateLookup("PSTR", 0),                 // PSTR,
        new ThingStateLookup("PINS", 0),                 // PINS,
        new ThingStateLookup("PINS", 1),                 // PINS2,
        new ThingStateLookup("PINS", 2),                 // PINS3,
        new ThingStateLookup("PINS", 3),                 // PINS4,
        new ThingStateLookup("MEGA", 0),                 // MEGA,
        new ThingStateLookup("MEGA", 1),                 // MEGA2,
        new ThingStateLookup("MEGA", 2),                 // MEGA3,
        new ThingStateLookup("MEGA", 3),                 // MEGA4,
        new ThingStateLookup("SUIT", 0),                 // SUIT,
        new ThingStateLookup("PMAP", 0),                 // PMAP,
        new ThingStateLookup("PMAP", 1),                 // PMAP2,
        new ThingStateLookup("PMAP", 2),                 // PMAP3,
        new ThingStateLookup("PMAP", 3),                 // PMAP4,
        new ThingStateLookup("PMAP", 4),                 // PMAP5,
        new ThingStateLookup("PMAP", 5),                 // PMAP6,
        new ThingStateLookup("PVIS", 0),                 // PVIS,
        new ThingStateLookup("PVIS", 1),                 // PVIS2,
        new ThingStateLookup("CLIP", 0),                 // CLIP,
        new ThingStateLookup("AMMO", 0),                 // AMMO,
        new ThingStateLookup("ROCK", 0),                 // ROCK,
        new ThingStateLookup("BROK", 0),                 // BROK,
        new ThingStateLookup("CELL", 0),                 // CELL,
        new ThingStateLookup("CELP", 0),                 // CELP,
        new ThingStateLookup("SHEL", 0),                 // SHEL,
        new ThingStateLookup("SBOX", 0),                 // SBOX,
        new ThingStateLookup("BPAK", 0),                 // BPAK,
        new ThingStateLookup("BFUG", 0),                 // BFUG,
        new ThingStateLookup("MGUN", 0),                 // MGUN,
        new ThingStateLookup("CSAW", 0),                 // CSAW,
        new ThingStateLookup("LAUN", 0),                 // LAUN,
        new ThingStateLookup("PLAS", 0),                 // PLAS,
        new ThingStateLookup("SHOT", 0),                 // SHOT,
        new ThingStateLookup("SGN2", 0),                 // SHOT2,
        new ThingStateLookup("COLU", 0),                 // COLU,
        new ThingStateLookup("SMT2", 0),                 // STALAG,
        new ThingStateLookup("GOR1", 0),                 // BLOODYTWITCH,
        new ThingStateLookup("GOR1", 1),                 // BLOODYTWITCH2,
        new ThingStateLookup("GOR1", 2),                 // BLOODYTWITCH3,
        new ThingStateLookup("GOR1", 3),                 // BLOODYTWITCH4,
        new ThingStateLookup("PLAY", 0, "DeadTorso"),    // DEADTORSO, (Doom made a state for this, inaccessible except for dehacked)
        new ThingStateLookup("PLAY", 0, "GibbedMarine"), // DEADBOTTOM, (Doom made a state for this, inaccessible except for dehacked)
        new ThingStateLookup("POL2", 0),                 // HEADSONSTICK,
        new ThingStateLookup("POL5", 0),                 // GIBS,
        new ThingStateLookup("POL4", 0),                 // HEADONASTICK,
        new ThingStateLookup("POL3", 0),                 // HEADCANDLES,
        new ThingStateLookup("POL3", 1),                 // HEADCANDLES2,
        new ThingStateLookup("POL1", 0),                 // DEADSTICK,
        new ThingStateLookup("POL6", 0),                 // LIVESTICK,
        new ThingStateLookup("POL6", 1),                 // LIVESTICK2,
        new ThingStateLookup("GOR2", 0),                 // MEAT2,
        new ThingStateLookup("GOR3", 0),                 // MEAT3,
        new ThingStateLookup("GOR4", 0),                 // MEAT4,
        new ThingStateLookup("GOR5", 0),                 // MEAT5,
        new ThingStateLookup("SMIT", 0),                 // STALAGTITE,
        new ThingStateLookup("COL1", 0),                 // TALLGRNCOL,
        new ThingStateLookup("COL2", 0),                 // SHRTGRNCOL,
        new ThingStateLookup("COL3", 0),                 // TALLREDCOL,
        new ThingStateLookup("COL4", 0),                 // SHRTREDCOL,
        new ThingStateLookup("CAND", 0),                 // CANDLESTIK,
        new ThingStateLookup("CBRA", 0),                 // CANDELABRA,
        new ThingStateLookup("COL6", 0),                 // SKULLCOL,
        new ThingStateLookup("TRE1", 0),                 // TORCHTREE,
        new ThingStateLookup("TRE2", 0),                 // BIGTREE,
        new ThingStateLookup("ELEC", 0),                 // TECHPILLAR,
        new ThingStateLookup("CEYE", 0),                 // EVILEYE,
        new ThingStateLookup("CEYE", 1),                 // EVILEYE2,
        new ThingStateLookup("CEYE", 2),                 // EVILEYE3,
        new ThingStateLookup("CEYE", 3),                 // EVILEYE4,
        new ThingStateLookup("FSKU", 0),                 // FLOATSKULL,
        new ThingStateLookup("FSKU", 1),                 // FLOATSKULL2,
        new ThingStateLookup("FSKU", 2),                 // FLOATSKULL3,
        new ThingStateLookup("COL5", 0),                 // HEARTCOL,
        new ThingStateLookup("COL5", 1),                 // HEARTCOL2,
        new ThingStateLookup("TBLU", 0),                 // BLUETORCH,
        new ThingStateLookup("TBLU", 1),                 // BLUETORCH2,
        new ThingStateLookup("TBLU", 2),                 // BLUETORCH3,
        new ThingStateLookup("TBLU", 3),                 // BLUETORCH4,
        new ThingStateLookup("TGRN", 0),                 // GREENTORCH,
        new ThingStateLookup("TGRN", 1),                 // GREENTORCH2,
        new ThingStateLookup("TGRN", 2),                 // GREENTORCH3,
        new ThingStateLookup("TGRN", 3),                 // GREENTORCH4,
        new ThingStateLookup("TRED", 0),                 // REDTORCH,
        new ThingStateLookup("TRED", 1),                 // REDTORCH2,
        new ThingStateLookup("TRED", 2),                 // REDTORCH3,
        new ThingStateLookup("TRED", 3),                 // REDTORCH4,
        new ThingStateLookup("SMBT", 0),                 // BTORCHSHRT,
        new ThingStateLookup("SMBT", 1),                 // BTORCHSHRT2,
        new ThingStateLookup("SMBT", 2),                 // BTORCHSHRT3,
        new ThingStateLookup("SMBT", 3),                 // BTORCHSHRT4,
        new ThingStateLookup("SMGT", 0),                 // GTORCHSHRT,
        new ThingStateLookup("SMGT", 1),                 // GTORCHSHRT2,
        new ThingStateLookup("SMGT", 2),                 // GTORCHSHRT3,
        new ThingStateLookup("SMGT", 3),                 // GTORCHSHRT4,
        new ThingStateLookup("SMRT", 0),                 // RTORCHSHRT,
        new ThingStateLookup("SMRT", 1),                 // RTORCHSHRT2,
        new ThingStateLookup("SMRT", 2),                 // RTORCHSHRT3,
        new ThingStateLookup("SMRT", 3),                 // RTORCHSHRT4,
        new ThingStateLookup("HDB1", 0),                 // HANGNOGUTS,
        new ThingStateLookup("HDB2", 0),                 // HANGBNOBRAIN,
        new ThingStateLookup("HDB3", 0),                 // HANGTLOOKDN,
        new ThingStateLookup("HDB4", 0),                 // HANGTSKULL,
        new ThingStateLookup("HDB5", 0),                 // HANGTLOOKUP,
        new ThingStateLookup("HDB6", 0),                 // HANGTNOBRAIN,
        new ThingStateLookup("POB1", 0),                 // COLONGIBS,
        new ThingStateLookup("POB2", 0),                 // SMALLPOOL,
        new ThingStateLookup("BRS1", 0),                 // BRAINSTEM,
        new ThingStateLookup("TLMP", 0),                 // TECHLAMP,
        new ThingStateLookup("TLMP", 1),                 // TECHLAMP2,
        new ThingStateLookup("TLMP", 2),                 // TECHLAMP3,
        new ThingStateLookup("TLMP", 3),                 // TECHLAMP4,
        new ThingStateLookup("TLP2", 0),                 // TECH2LAMP,
        new ThingStateLookup("TLP2", 1),                 // TECH2LAMP2,
        new ThingStateLookup("TLP2", 2),                 // TECH2LAMP3,
        new ThingStateLookup("TLP2", 3),                 // TECH2LAMP4,
        // End Vanilla
        new ThingStateLookup("TNT1", 0),                 // TNT1
        new ThingStateLookup("MISL", 4, "Grenade"),      // GRENADE
        new ThingStateLookup("MISL", 5, "Grenade"),      // DETONATE
        new ThingStateLookup("MISL", 6, "Grenade"),      // DETONATE2
        new ThingStateLookup("MISL", 7, "Grenade"),      // DETONATE3
        new ThingStateLookup("DOGS", 0),                 // DOGS_STND
        new ThingStateLookup("DOGS", 1),                 // DOGS_STND2
        new ThingStateLookup("DOGS", 2),                 // DOGS_RUN1
        new ThingStateLookup("DOGS", 3),                 // DOGS_RUN2
        new ThingStateLookup("DOGS", 4),                 // DOGS_RUN3
        new ThingStateLookup("DOGS", 5),                 // DOGS_RUN4
        new ThingStateLookup("DOGS", 6),                 // DOGS_RUN5
        new ThingStateLookup("DOGS", 7),                 // DOGS_RUN6
        new ThingStateLookup("DOGS", 8),                 // DOGS_RUN7
        new ThingStateLookup("DOGS", 9),                 // DOGS_RUN8
        new ThingStateLookup("DOGS", 10),                // DOGS_ATK1
        new ThingStateLookup("DOGS", 11),                // DOGS_ATK2
        new ThingStateLookup("DOGS", 12),                // DOGS_ATK3
        new ThingStateLookup("DOGS", 13),                // DOGS_PAIN
        new ThingStateLookup("DOGS", 14),                // DOGS_PAIN2
        new ThingStateLookup("DOGS", 15),                // DOGS_DIE1
        new ThingStateLookup("DOGS", 16),                // DOGS_DIE2
        new ThingStateLookup("DOGS", 17),                // DOGS_DIE3
        new ThingStateLookup("DOGS", 18),                // DOGS_DIE4
        new ThingStateLookup("DOGS", 19),                // DOGS_DIE5
        new ThingStateLookup("DOGS", 20),                // DOGS_DIE6
        new ThingStateLookup("DOGS", 21),                // DOGS_RAISE1
        new ThingStateLookup("DOGS", 22),                // DOGS_RAISE2
        new ThingStateLookup("DOGS", 23),                // DOGS_RAISE3
        new ThingStateLookup("DOGS", 24),                // DOGS_RAISE4
        new ThingStateLookup("DOGS", 25),                // DOGS_RAISE5
        new ThingStateLookup("DOGS", 26),                // DOGS_RAISE6
        new ThingStateLookup("BFGG", 10),                // OLDBFG1,
        new ThingStateLookup("BFGG", 11),                // OLDBFG2,
        new ThingStateLookup("BFGG", 12),                // OLDBFG3,
        new ThingStateLookup("BFGG", 13),                // OLDBFG4,
        new ThingStateLookup("BFGG", 14),                // OLDBFG5,
        new ThingStateLookup("BFGG", 15),                // OLDBFG6,
        new ThingStateLookup("BFGG", 16),                // OLDBFG7,
        new ThingStateLookup("BFGG", 17),                // OLDBFG8,
        new ThingStateLookup("BFGG", 18),                // OLDBFG9,
        new ThingStateLookup("BFGG", 19),                // OLDBFG10,
        new ThingStateLookup("BFGG", 20),                // OLDBFG11,
        new ThingStateLookup("BFGG", 21),                // OLDBFG12,
        new ThingStateLookup("BFGG", 22),                // OLDBFG13,
        new ThingStateLookup("BFGG", 23),                // OLDBFG14,
        new ThingStateLookup("BFGG", 24),                // OLDBFG15,
        new ThingStateLookup("BFGG", 25),                // OLDBFG16,
        new ThingStateLookup("BFGG", 26),                // OLDBFG17,
        new ThingStateLookup("BFGG", 27),                // OLDBFG18,
        new ThingStateLookup("BFGG", 28),                // OLDBFG19,
        new ThingStateLookup("BFGG", 29),                // OLDBFG20,
        new ThingStateLookup("BFGG", 30),                // OLDBFG21,
        new ThingStateLookup("BFGG", 31),                // OLDBFG22,
        new ThingStateLookup("BFGG", 32),                // OLDBFG23,
        new ThingStateLookup("BFGG", 33),                // OLDBFG24,
        new ThingStateLookup("BFGG", 34),                // OLDBFG25,
        new ThingStateLookup("BFGG", 35),                // OLDBFG26,
        new ThingStateLookup("BFGG", 36),                // OLDBFG27,
        new ThingStateLookup("BFGG", 37),                // OLDBFG28,
        new ThingStateLookup("BFGG", 38),                // OLDBFG29,
        new ThingStateLookup("BFGG", 39),                // OLDBFG30,
        new ThingStateLookup("BFGG", 40),                // OLDBFG31,
        new ThingStateLookup("BFGG", 41),                // OLDBFG32,
        new ThingStateLookup("BFGG", 42),                // OLDBFG33,
        new ThingStateLookup("BFGG", 43),                // OLDBFG34,
        new ThingStateLookup("BFGG", 44),                // OLDBFG35,
        new ThingStateLookup("BFGG", 45),                // OLDBFG36,
        new ThingStateLookup("BFGG", 46),                // OLDBFG37,
        new ThingStateLookup("BFGG", 47),                // OLDBFG38,
        new ThingStateLookup("BFGG", 48),                // OLDBFG39,
        new ThingStateLookup("BFGG", 49),                // OLDBFG40,
        new ThingStateLookup("BFGG", 50),                // OLDBFG41,
        new ThingStateLookup("BFGG", 51),                // OLDBFG42,
        new ThingStateLookup("BFGG", 52),                // OLDBFG43,
        new ThingStateLookup("PLS1", 0),                 // PLS1BALL,
        new ThingStateLookup("PLS1", 1),                 // PLS1BALL2,
        new ThingStateLookup("PLS1", 2),                 // PLS1EXP,
        new ThingStateLookup("PLS1", 3),                 // PLS1EXP2,
        new ThingStateLookup("PLS1", 4),                 // PLS1EXP3,
        new ThingStateLookup("PLS1", 5),                 // PLS1EXP4,
        new ThingStateLookup("PLS1", 6),                 // PLS1EXP5,
        new ThingStateLookup("PLS2", 0),                 // PLS2BALL,
        new ThingStateLookup("PLS2", 1),                 // PLS2BALL2,
        new ThingStateLookup("PLS2", 2),                 // PLS2BALLX1,
        new ThingStateLookup("PLS2", 3),                 // PLS2BALLX2,
        new ThingStateLookup("PLS2", 4),                 // PLS2BALLX3,
        new ThingStateLookup("BON3", 0),                 // BON3,
        new ThingStateLookup("BON4", 0),                 // BON4,
        new ThingStateLookup("SKUL", 0, "BetaSkull"),    // BSKUL_STND,
        new ThingStateLookup("SKUL", 1, "BetaSkull"),    // BSKUL_RUN1,
        new ThingStateLookup("SKUL", 2, "BetaSkull"),    // BSKUL_RUN2,
        new ThingStateLookup("SKUL", 3, "BetaSkull"),    // BSKUL_RUN3,
        new ThingStateLookup("SKUL", 4, "BetaSkull"),    // BSKUL_RUN4,
        new ThingStateLookup("SKUL", 5, "BetaSkull"),    // BSKUL_ATK1,
        new ThingStateLookup("SKUL", 6, "BetaSkull"),    // BSKUL_ATK2,
        new ThingStateLookup("SKUL", 7, "BetaSkull"),    // BSKUL_ATK3,
        new ThingStateLookup("SKUL", 8, "BetaSkull"),    // BSKUL_PAIN1,
        new ThingStateLookup("SKUL", 9, "BetaSkull"),    // BSKUL_PAIN2,
        new ThingStateLookup("SKUL", 10, "BetaSkull"),   // BSKUL_PAIN3,
        new ThingStateLookup("SKUL", 11, "BetaSkull"),   // BSKUL_DIE1,
        new ThingStateLookup("SKUL", 12, "BetaSkull"),   // BSKUL_DIE2,
        new ThingStateLookup("SKUL", 13, "BetaSkull"),   // BSKUL_DIE3,
        new ThingStateLookup("SKUL", 14, "BetaSkull"),   // BSKUL_DIE4,
        new ThingStateLookup("SKUL", 15, "BetaSkull"),   // BSKUL_DIE5,
        new ThingStateLookup("SKUL", 16, "BetaSkull"),   // BSKUL_DIE6,
        new ThingStateLookup("SKUL", 17, "BetaSkull"),   // BSKUL_DIE7,
        new ThingStateLookup("SKUL", 18, "BetaSkull"),   // BSKUL_DIE8,
        new ThingStateLookup("MISL", 8, "Grenade"),      // MUSHROOM,
        // End MBF
    };

    public enum ThingState
    {
        NULL,
        LIGHTDONE,
        PUNCH,
        PUNCHDOWN,
        PUNCHUP,
        PUNCH1,
        PUNCH2,
        PUNCH3,
        PUNCH4,
        PUNCH5,
        PISTOL,
        PISTOLDOWN,
        PISTOLUP,
        PISTOL1,
        PISTOL2,
        PISTOL3,
        PISTOL4,
        PISTOLFLASH,
        SGUN,
        SGUNDOWN,
        SGUNUP,
        SGUN1,
        SGUN2,
        SGUN3,
        SGUN4,
        SGUN5,
        SGUN6,
        SGUN7,
        SGUN8,
        SGUN9,
        SGUNFLASH1,
        SGUNFLASH2,
        DSGUN,
        DSGUNDOWN,
        DSGUNUP,
        DSGUN1,
        DSGUN2,
        DSGUN3,
        DSGUN4,
        DSGUN5,
        DSGUN6,
        DSGUN7,
        DSGUN8,
        DSGUN9,
        DSGUN10,
        DSNR1,
        DSNR2,
        DSGUNFLASH1,
        DSGUNFLASH2,
        CHAIN,
        CHAINDOWN,
        CHAINUP,
        CHAIN1,
        CHAIN2,
        CHAIN3,
        CHAINFLASH1,
        CHAINFLASH2,
        MISSILE,
        MISSILEDOWN,
        MISSILEUP,
        MISSILE1,
        MISSILE2,
        MISSILE3,
        MISSILEFLASH1,
        MISSILEFLASH2,
        MISSILEFLASH3,
        MISSILEFLASH4,
        SAW,
        SAWB,
        SAWDOWN,
        SAWUP,
        SAW1,
        SAW2,
        SAW3,
        PLASMA,
        PLASMADOWN,
        PLASMAUP,
        PLASMA1,
        PLASMA2,
        PLASMAFLASH1,
        PLASMAFLASH2,
        BFG,
        BFGDOWN,
        BFGUP,
        BFG1,
        BFG2,
        BFG3,
        BFG4,
        BFGFLASH1,
        BFGFLASH2,
        BLOOD1,
        BLOOD2,
        BLOOD3,
        PUFF1,
        PUFF2,
        PUFF3,
        PUFF4,
        TBALL1,
        TBALL2,
        TBALLX1,
        TBALLX2,
        TBALLX3,
        RBALL1,
        RBALL2,
        RBALLX1,
        RBALLX2,
        RBALLX3,
        PLASBALL,
        PLASBALL2,
        PLASEXP,
        PLASEXP2,
        PLASEXP3,
        PLASEXP4,
        PLASEXP5,
        ROCKET,
        BFGSHOT,
        BFGSHOT2,
        BFGLAND,
        BFGLAND2,
        BFGLAND3,
        BFGLAND4,
        BFGLAND5,
        BFGLAND6,
        BFGEXP,
        BFGEXP2,
        BFGEXP3,
        BFGEXP4,
        EXPLODE1,
        EXPLODE2,
        EXPLODE3,
        TFOG,
        TFOG01,
        TFOG02,
        TFOG2,
        TFOG3,
        TFOG4,
        TFOG5,
        TFOG6,
        TFOG7,
        TFOG8,
        TFOG9,
        TFOG10,
        IFOG,
        IFOG01,
        IFOG02,
        IFOG2,
        IFOG3,
        IFOG4,
        IFOG5,
        PLAY,
        PLAY_RUN1,
        PLAY_RUN2,
        PLAY_RUN3,
        PLAY_RUN4,
        PLAY_ATK1,
        PLAY_ATK2,
        PLAY_PAIN,
        PLAY_PAIN2,
        PLAY_DIE1,
        PLAY_DIE2,
        PLAY_DIE3,
        PLAY_DIE4,
        PLAY_DIE5,
        PLAY_DIE6,
        PLAY_DIE7,
        PLAY_XDIE1,
        PLAY_XDIE2,
        PLAY_XDIE3,
        PLAY_XDIE4,
        PLAY_XDIE5,
        PLAY_XDIE6,
        PLAY_XDIE7,
        PLAY_XDIE8,
        PLAY_XDIE9,
        POSS_STND,
        POSS_STND2,
        POSS_RUN1,
        POSS_RUN2,
        POSS_RUN3,
        POSS_RUN4,
        POSS_RUN5,
        POSS_RUN6,
        POSS_RUN7,
        POSS_RUN8,
        POSS_ATK1,
        POSS_ATK2,
        POSS_ATK3,
        POSS_PAIN,
        POSS_PAIN2,
        POSS_DIE1,
        POSS_DIE2,
        POSS_DIE3,
        POSS_DIE4,
        POSS_DIE5,
        POSS_XDIE1,
        POSS_XDIE2,
        POSS_XDIE3,
        POSS_XDIE4,
        POSS_XDIE5,
        POSS_XDIE6,
        POSS_XDIE7,
        POSS_XDIE8,
        POSS_XDIE9,
        POSS_RAISE1,
        POSS_RAISE2,
        POSS_RAISE3,
        POSS_RAISE4,
        SPOS_STND,
        SPOS_STND2,
        SPOS_RUN1,
        SPOS_RUN2,
        SPOS_RUN3,
        SPOS_RUN4,
        SPOS_RUN5,
        SPOS_RUN6,
        SPOS_RUN7,
        SPOS_RUN8,
        SPOS_ATK1,
        SPOS_ATK2,
        SPOS_ATK3,
        SPOS_PAIN,
        SPOS_PAIN2,
        SPOS_DIE1,
        SPOS_DIE2,
        SPOS_DIE3,
        SPOS_DIE4,
        SPOS_DIE5,
        SPOS_XDIE1,
        SPOS_XDIE2,
        SPOS_XDIE3,
        SPOS_XDIE4,
        SPOS_XDIE5,
        SPOS_XDIE6,
        SPOS_XDIE7,
        SPOS_XDIE8,
        SPOS_XDIE9,
        SPOS_RAISE1,
        SPOS_RAISE2,
        SPOS_RAISE3,
        SPOS_RAISE4,
        SPOS_RAISE5,
        VILE_STND,
        VILE_STND2,
        VILE_RUN1,
        VILE_RUN2,
        VILE_RUN3,
        VILE_RUN4,
        VILE_RUN5,
        VILE_RUN6,
        VILE_RUN7,
        VILE_RUN8,
        VILE_RUN9,
        VILE_RUN10,
        VILE_RUN11,
        VILE_RUN12,
        VILE_ATK1,
        VILE_ATK2,
        VILE_ATK3,
        VILE_ATK4,
        VILE_ATK5,
        VILE_ATK6,
        VILE_ATK7,
        VILE_ATK8,
        VILE_ATK9,
        VILE_ATK10,
        VILE_ATK11,
        VILE_HEAL1,
        VILE_HEAL2,
        VILE_HEAL3,
        VILE_PAIN,
        VILE_PAIN2,
        VILE_DIE1,
        VILE_DIE2,
        VILE_DIE3,
        VILE_DIE4,
        VILE_DIE5,
        VILE_DIE6,
        VILE_DIE7,
        VILE_DIE8,
        VILE_DIE9,
        VILE_DIE10,
        FIRE1,
        FIRE2,
        FIRE3,
        FIRE4,
        FIRE5,
        FIRE6,
        FIRE7,
        FIRE8,
        FIRE9,
        FIRE10,
        FIRE11,
        FIRE12,
        FIRE13,
        FIRE14,
        FIRE15,
        FIRE16,
        FIRE17,
        FIRE18,
        FIRE19,
        FIRE20,
        FIRE21,
        FIRE22,
        FIRE23,
        FIRE24,
        FIRE25,
        FIRE26,
        FIRE27,
        FIRE28,
        FIRE29,
        FIRE30,
        SMOKE1,
        SMOKE2,
        SMOKE3,
        SMOKE4,
        SMOKE5,
        TRACER,
        TRACER2,
        TRACEEXP1,
        TRACEEXP2,
        TRACEEXP3,
        SKEL_STND,
        SKEL_STND2,
        SKEL_RUN1,
        SKEL_RUN2,
        SKEL_RUN3,
        SKEL_RUN4,
        SKEL_RUN5,
        SKEL_RUN6,
        SKEL_RUN7,
        SKEL_RUN8,
        SKEL_RUN9,
        SKEL_RUN10,
        SKEL_RUN11,
        SKEL_RUN12,
        SKEL_FIST1,
        SKEL_FIST2,
        SKEL_FIST3,
        SKEL_FIST4,
        SKEL_MISS1,
        SKEL_MISS2,
        SKEL_MISS3,
        SKEL_MISS4,
        SKEL_PAIN,
        SKEL_PAIN2,
        SKEL_DIE1,
        SKEL_DIE2,
        SKEL_DIE3,
        SKEL_DIE4,
        SKEL_DIE5,
        SKEL_DIE6,
        SKEL_RAISE1,
        SKEL_RAISE2,
        SKEL_RAISE3,
        SKEL_RAISE4,
        SKEL_RAISE5,
        SKEL_RAISE6,
        FATSHOT1,
        FATSHOT2,
        FATSHOTX1,
        FATSHOTX2,
        FATSHOTX3,
        FATT_STND,
        FATT_STND2,
        FATT_RUN1,
        FATT_RUN2,
        FATT_RUN3,
        FATT_RUN4,
        FATT_RUN5,
        FATT_RUN6,
        FATT_RUN7,
        FATT_RUN8,
        FATT_RUN9,
        FATT_RUN10,
        FATT_RUN11,
        FATT_RUN12,
        FATT_ATK1,
        FATT_ATK2,
        FATT_ATK3,
        FATT_ATK4,
        FATT_ATK5,
        FATT_ATK6,
        FATT_ATK7,
        FATT_ATK8,
        FATT_ATK9,
        FATT_ATK10,
        FATT_PAIN,
        FATT_PAIN2,
        FATT_DIE1,
        FATT_DIE2,
        FATT_DIE3,
        FATT_DIE4,
        FATT_DIE5,
        FATT_DIE6,
        FATT_DIE7,
        FATT_DIE8,
        FATT_DIE9,
        FATT_DIE10,
        FATT_RAISE1,
        FATT_RAISE2,
        FATT_RAISE3,
        FATT_RAISE4,
        FATT_RAISE5,
        FATT_RAISE6,
        FATT_RAISE7,
        FATT_RAISE8,
        CPOS_STND,
        CPOS_STND2,
        CPOS_RUN1,
        CPOS_RUN2,
        CPOS_RUN3,
        CPOS_RUN4,
        CPOS_RUN5,
        CPOS_RUN6,
        CPOS_RUN7,
        CPOS_RUN8,
        CPOS_ATK1,
        CPOS_ATK2,
        CPOS_ATK3,
        CPOS_ATK4,
        CPOS_PAIN,
        CPOS_PAIN2,
        CPOS_DIE1,
        CPOS_DIE2,
        CPOS_DIE3,
        CPOS_DIE4,
        CPOS_DIE5,
        CPOS_DIE6,
        CPOS_DIE7,
        CPOS_XDIE1,
        CPOS_XDIE2,
        CPOS_XDIE3,
        CPOS_XDIE4,
        CPOS_XDIE5,
        CPOS_XDIE6,
        CPOS_RAISE1,
        CPOS_RAISE2,
        CPOS_RAISE3,
        CPOS_RAISE4,
        CPOS_RAISE5,
        CPOS_RAISE6,
        CPOS_RAISE7,
        TROO_STND,
        TROO_STND2,
        TROO_RUN1,
        TROO_RUN2,
        TROO_RUN3,
        TROO_RUN4,
        TROO_RUN5,
        TROO_RUN6,
        TROO_RUN7,
        TROO_RUN8,
        TROO_ATK1,
        TROO_ATK2,
        TROO_ATK3,
        TROO_PAIN,
        TROO_PAIN2,
        TROO_DIE1,
        TROO_DIE2,
        TROO_DIE3,
        TROO_DIE4,
        TROO_DIE5,
        TROO_XDIE1,
        TROO_XDIE2,
        TROO_XDIE3,
        TROO_XDIE4,
        TROO_XDIE5,
        TROO_XDIE6,
        TROO_XDIE7,
        TROO_XDIE8,
        TROO_RAISE1,
        TROO_RAISE2,
        TROO_RAISE3,
        TROO_RAISE4,
        TROO_RAISE5,
        SARG_STND,
        SARG_STND2,
        SARG_RUN1,
        SARG_RUN2,
        SARG_RUN3,
        SARG_RUN4,
        SARG_RUN5,
        SARG_RUN6,
        SARG_RUN7,
        SARG_RUN8,
        SARG_ATK1,
        SARG_ATK2,
        SARG_ATK3,
        SARG_PAIN,
        SARG_PAIN2,
        SARG_DIE1,
        SARG_DIE2,
        SARG_DIE3,
        SARG_DIE4,
        SARG_DIE5,
        SARG_DIE6,
        SARG_RAISE1,
        SARG_RAISE2,
        SARG_RAISE3,
        SARG_RAISE4,
        SARG_RAISE5,
        SARG_RAISE6,
        HEAD_STND,
        HEAD_RUN1,
        HEAD_ATK1,
        HEAD_ATK2,
        HEAD_ATK3,
        HEAD_PAIN,
        HEAD_PAIN2,
        HEAD_PAIN3,
        HEAD_DIE1,
        HEAD_DIE2,
        HEAD_DIE3,
        HEAD_DIE4,
        HEAD_DIE5,
        HEAD_DIE6,
        HEAD_RAISE1,
        HEAD_RAISE2,
        HEAD_RAISE3,
        HEAD_RAISE4,
        HEAD_RAISE5,
        HEAD_RAISE6,
        BRBALL1,
        BRBALL2,
        BRBALLX1,
        BRBALLX2,
        BRBALLX3,
        BOSS_STND,
        BOSS_STND2,
        BOSS_RUN1,
        BOSS_RUN2,
        BOSS_RUN3,
        BOSS_RUN4,
        BOSS_RUN5,
        BOSS_RUN6,
        BOSS_RUN7,
        BOSS_RUN8,
        BOSS_ATK1,
        BOSS_ATK2,
        BOSS_ATK3,
        BOSS_PAIN,
        BOSS_PAIN2,
        BOSS_DIE1,
        BOSS_DIE2,
        BOSS_DIE3,
        BOSS_DIE4,
        BOSS_DIE5,
        BOSS_DIE6,
        BOSS_DIE7,
        BOSS_RAISE1,
        BOSS_RAISE2,
        BOSS_RAISE3,
        BOSS_RAISE4,
        BOSS_RAISE5,
        BOSS_RAISE6,
        BOSS_RAISE7,
        BOS2_STND,
        BOS2_STND2,
        BOS2_RUN1,
        BOS2_RUN2,
        BOS2_RUN3,
        BOS2_RUN4,
        BOS2_RUN5,
        BOS2_RUN6,
        BOS2_RUN7,
        BOS2_RUN8,
        BOS2_ATK1,
        BOS2_ATK2,
        BOS2_ATK3,
        BOS2_PAIN,
        BOS2_PAIN2,
        BOS2_DIE1,
        BOS2_DIE2,
        BOS2_DIE3,
        BOS2_DIE4,
        BOS2_DIE5,
        BOS2_DIE6,
        BOS2_DIE7,
        BOS2_RAISE1,
        BOS2_RAISE2,
        BOS2_RAISE3,
        BOS2_RAISE4,
        BOS2_RAISE5,
        BOS2_RAISE6,
        BOS2_RAISE7,
        SKULL_STND,
        SKULL_STND2,
        SKULL_RUN1,
        SKULL_RUN2,
        SKULL_ATK1,
        SKULL_ATK2,
        SKULL_ATK3,
        SKULL_ATK4,
        SKULL_PAIN,
        SKULL_PAIN2,
        SKULL_DIE1,
        SKULL_DIE2,
        SKULL_DIE3,
        SKULL_DIE4,
        SKULL_DIE5,
        SKULL_DIE6,
        SPID_STND,
        SPID_STND2,
        SPID_RUN1,
        SPID_RUN2,
        SPID_RUN3,
        SPID_RUN4,
        SPID_RUN5,
        SPID_RUN6,
        SPID_RUN7,
        SPID_RUN8,
        SPID_RUN9,
        SPID_RUN10,
        SPID_RUN11,
        SPID_RUN12,
        SPID_ATK1,
        SPID_ATK2,
        SPID_ATK3,
        SPID_ATK4,
        SPID_PAIN,
        SPID_PAIN2,
        SPID_DIE1,
        SPID_DIE2,
        SPID_DIE3,
        SPID_DIE4,
        SPID_DIE5,
        SPID_DIE6,
        SPID_DIE7,
        SPID_DIE8,
        SPID_DIE9,
        SPID_DIE10,
        SPID_DIE11,
        BSPI_STND,
        BSPI_STND2,
        BSPI_SIGHT,
        BSPI_RUN1,
        BSPI_RUN2,
        BSPI_RUN3,
        BSPI_RUN4,
        BSPI_RUN5,
        BSPI_RUN6,
        BSPI_RUN7,
        BSPI_RUN8,
        BSPI_RUN9,
        BSPI_RUN10,
        BSPI_RUN11,
        BSPI_RUN12,
        BSPI_ATK1,
        BSPI_ATK2,
        BSPI_ATK3,
        BSPI_ATK4,
        BSPI_PAIN,
        BSPI_PAIN2,
        BSPI_DIE1,
        BSPI_DIE2,
        BSPI_DIE3,
        BSPI_DIE4,
        BSPI_DIE5,
        BSPI_DIE6,
        BSPI_DIE7,
        BSPI_RAISE1,
        BSPI_RAISE2,
        BSPI_RAISE3,
        BSPI_RAISE4,
        BSPI_RAISE5,
        BSPI_RAISE6,
        BSPI_RAISE7,
        ARACH_PLAZ,
        ARACH_PLAZ2,
        ARACH_PLEX,
        ARACH_PLEX2,
        ARACH_PLEX3,
        ARACH_PLEX4,
        ARACH_PLEX5,
        CYBER_STND,
        CYBER_STND2,
        CYBER_RUN1,
        CYBER_RUN2,
        CYBER_RUN3,
        CYBER_RUN4,
        CYBER_RUN5,
        CYBER_RUN6,
        CYBER_RUN7,
        CYBER_RUN8,
        CYBER_ATK1,
        CYBER_ATK2,
        CYBER_ATK3,
        CYBER_ATK4,
        CYBER_ATK5,
        CYBER_ATK6,
        CYBER_PAIN,
        CYBER_DIE1,
        CYBER_DIE2,
        CYBER_DIE3,
        CYBER_DIE4,
        CYBER_DIE5,
        CYBER_DIE6,
        CYBER_DIE7,
        CYBER_DIE8,
        CYBER_DIE9,
        CYBER_DIE10,
        PAIN_STND,
        PAIN_RUN1,
        PAIN_RUN2,
        PAIN_RUN3,
        PAIN_RUN4,
        PAIN_RUN5,
        PAIN_RUN6,
        PAIN_ATK1,
        PAIN_ATK2,
        PAIN_ATK3,
        PAIN_ATK4,
        PAIN_PAIN,
        PAIN_PAIN2,
        PAIN_DIE1,
        PAIN_DIE2,
        PAIN_DIE3,
        PAIN_DIE4,
        PAIN_DIE5,
        PAIN_DIE6,
        PAIN_RAISE1,
        PAIN_RAISE2,
        PAIN_RAISE3,
        PAIN_RAISE4,
        PAIN_RAISE5,
        PAIN_RAISE6,
        SSWV_STND,
        SSWV_STND2,
        SSWV_RUN1,
        SSWV_RUN2,
        SSWV_RUN3,
        SSWV_RUN4,
        SSWV_RUN5,
        SSWV_RUN6,
        SSWV_RUN7,
        SSWV_RUN8,
        SSWV_ATK1,
        SSWV_ATK2,
        SSWV_ATK3,
        SSWV_ATK4,
        SSWV_ATK5,
        SSWV_ATK6,
        SSWV_PAIN,
        SSWV_PAIN2,
        SSWV_DIE1,
        SSWV_DIE2,
        SSWV_DIE3,
        SSWV_DIE4,
        SSWV_DIE5,
        SSWV_XDIE1,
        SSWV_XDIE2,
        SSWV_XDIE3,
        SSWV_XDIE4,
        SSWV_XDIE5,
        SSWV_XDIE6,
        SSWV_XDIE7,
        SSWV_XDIE8,
        SSWV_XDIE9,
        SSWV_RAISE1,
        SSWV_RAISE2,
        SSWV_RAISE3,
        SSWV_RAISE4,
        SSWV_RAISE5,
        KEENSTND,
        COMMKEEN,
        COMMKEEN2,
        COMMKEEN3,
        COMMKEEN4,
        COMMKEEN5,
        COMMKEEN6,
        COMMKEEN7,
        COMMKEEN8,
        COMMKEEN9,
        COMMKEEN10,
        COMMKEEN11,
        COMMKEEN12,
        KEENPAIN,
        KEENPAIN2,
        BRAIN,
        BRAIN_PAIN,
        BRAIN_DIE1,
        BRAIN_DIE2,
        BRAIN_DIE3,
        BRAIN_DIE4,
        BRAINEYE,
        BRAINEYESEE,
        BRAINEYE1,
        SPAWN1,
        SPAWN2,
        SPAWN3,
        SPAWN4,
        SPAWNFIRE1,
        SPAWNFIRE2,
        SPAWNFIRE3,
        SPAWNFIRE4,
        SPAWNFIRE5,
        SPAWNFIRE6,
        SPAWNFIRE7,
        SPAWNFIRE8,
        BRAINEXPLODE1,
        BRAINEXPLODE2,
        BRAINEXPLODE3,
        ARM1,
        ARM1A,
        ARM2,
        ARM2A,
        BAR1,
        BAR2,
        BEXP,
        BEXP2,
        BEXP3,
        BEXP4,
        BEXP5,
        BBAR1,
        BBAR2,
        BBAR3,
        BON1,
        BON1A,
        BON1B,
        BON1C,
        BON1D,
        BON1E,
        BON2,
        BON2A,
        BON2B,
        BON2C,
        BON2D,
        BON2E,
        BKEY,
        BKEY2,
        RKEY,
        RKEY2,
        YKEY,
        YKEY2,
        BSKULL,
        BSKULL2,
        RSKULL,
        RSKULL2,
        YSKULL,
        YSKULL2,
        STIM,
        MEDI,
        SOUL,
        SOUL2,
        SOUL3,
        SOUL4,
        SOUL5,
        SOUL6,
        PINV,
        PINV2,
        PINV3,
        PINV4,
        PSTR,
        PINS,
        PINS2,
        PINS3,
        PINS4,
        MEGA,
        MEGA2,
        MEGA3,
        MEGA4,
        SUIT,
        PMAP,
        PMAP2,
        PMAP3,
        PMAP4,
        PMAP5,
        PMAP6,
        PVIS,
        PVIS2,
        CLIP,
        AMMO,
        ROCK,
        BROK,
        CELL,
        CELP,
        SHEL,
        SBOX,
        BPAK,
        BFUG,
        MGUN,
        CSAW,
        LAUN,
        PLAS,
        SHOT,
        SHOT2,
        COLU,
        STALAG,
        BLOODYTWITCH,
        BLOODYTWITCH2,
        BLOODYTWITCH3,
        BLOODYTWITCH4,
        DEADTORSO,
        DEADBOTTOM,
        HEADSONSTICK,
        GIBS,
        HEADONASTICK,
        HEADCANDLES,
        HEADCANDLES2,
        DEADSTICK,
        LIVESTICK,
        LIVESTICK2,
        MEAT2,
        MEAT3,
        MEAT4,
        MEAT5,
        STALAGTITE,
        TALLGRNCOL,
        SHRTGRNCOL,
        TALLREDCOL,
        SHRTREDCOL,
        CANDLESTIK,
        CANDELABRA,
        SKULLCOL,
        TORCHTREE,
        BIGTREE,
        TECHPILLAR,
        EVILEYE,
        EVILEYE2,
        EVILEYE3,
        EVILEYE4,
        FLOATSKULL,
        FLOATSKULL2,
        FLOATSKULL3,
        HEARTCOL,
        HEARTCOL2,
        BLUETORCH,
        BLUETORCH2,
        BLUETORCH3,
        BLUETORCH4,
        GREENTORCH,
        GREENTORCH2,
        GREENTORCH3,
        GREENTORCH4,
        REDTORCH,
        REDTORCH2,
        REDTORCH3,
        REDTORCH4,
        BTORCHSHRT,
        BTORCHSHRT2,
        BTORCHSHRT3,
        BTORCHSHRT4,
        GTORCHSHRT,
        GTORCHSHRT2,
        GTORCHSHRT3,
        GTORCHSHRT4,
        RTORCHSHRT,
        RTORCHSHRT2,
        RTORCHSHRT3,
        RTORCHSHRT4,
        HANGNOGUTS,
        HANGBNOBRAIN,
        HANGTLOOKDN,
        HANGTSKULL,
        HANGTLOOKUP,
        HANGTNOBRAIN,
        COLONGIBS,
        SMALLPOOL,
        BRAINSTEM,
        TECHLAMP,
        TECHLAMP2,
        TECHLAMP3,
        TECHLAMP4,
        TECH2LAMP,
        TECH2LAMP2,
        TECH2LAMP3,
        TECH2LAMP4,
        TNT1,
        GRENADE,
        DETONATE,
        DETONATE2,
        DETONATE3,
        DOGS_STND,
        DOGS_STND2,
        DOGS_RUN1,
        DOGS_RUN2,
        DOGS_RUN3,
        DOGS_RUN4,
        DOGS_RUN5,
        DOGS_RUN6,
        DOGS_RUN7,
        DOGS_RUN8,
        DOGS_ATK1,
        DOGS_ATK2,
        DOGS_ATK3,
        DOGS_PAIN,
        DOGS_PAIN2,
        DOGS_DIE1,
        DOGS_DIE2,
        DOGS_DIE3,
        DOGS_DIE4,
        DOGS_DIE5,
        DOGS_DIE6,
        DOGS_RAISE1,
        DOGS_RAISE2,
        DOGS_RAISE3,
        DOGS_RAISE4,
        DOGS_RAISE5,
        DOGS_RAISE6,
        OLDBFG1,
        OLDBFG2,
        OLDBFG3,
        OLDBFG4,
        OLDBFG5,
        OLDBFG6,
        OLDBFG7,
        OLDBFG8,
        OLDBFG9,
        OLDBFG10,
        OLDBFG11,
        OLDBFG12,
        OLDBFG13,
        OLDBFG14,
        OLDBFG15,
        OLDBFG16,
        OLDBFG17,
        OLDBFG18,
        OLDBFG19,
        OLDBFG20,
        OLDBFG21,
        OLDBFG22,
        OLDBFG23,
        OLDBFG24,
        OLDBFG25,
        OLDBFG26,
        OLDBFG27,
        OLDBFG28,
        OLDBFG29,
        OLDBFG30,
        OLDBFG31,
        OLDBFG32,
        OLDBFG33,
        OLDBFG34,
        OLDBFG35,
        OLDBFG36,
        OLDBFG37,
        OLDBFG38,
        OLDBFG39,
        OLDBFG40,
        OLDBFG41,
        OLDBFG42,
        OLDBFG43,
        PLS1BALL,
        PLS1BALL2,
        PLS1EXP,
        PLS1EXP2,
        PLS1EXP3,
        PLS1EXP4,
        PLS1EXP5,
        PLS2BALL,
        PLS2BALL2,
        PLS2BALLX1,
        PLS2BALLX2,
        PLS2BALLX3,
        BON3,
        BON4,
        BSKUL_STND,
        BSKUL_RUN1,
        BSKUL_RUN2,
        BSKUL_RUN3,
        BSKUL_RUN4,
        BSKUL_ATK1,
        BSKUL_ATK2,
        BSKUL_ATK3,
        BSKUL_PAIN1,
        BSKUL_PAIN2,
        BSKUL_PAIN3,
        BSKUL_DIE1,
        BSKUL_DIE2,
        BSKUL_DIE3,
        BSKUL_DIE4,
        BSKUL_DIE5,
        BSKUL_DIE6,
        BSKUL_DIE7,
        BSKUL_DIE8,
        MUSHROOM,
        Count
    };

    public readonly string[] Sprites = new string[]
    {
        "TROO",
        "SHTG",
        "PUNG",
        "PISG",
        "PISF",
        "SHTF",
        "SHT2",
        "CHGG",
        "CHGF",
        "MISG",
        "MISF",
        "SAWG",
        "PLSG",
        "PLSF",
        "BFGG",
        "BFGF",
        "BLUD",
        "PUFF",
        "BAL1",
        "BAL2",
        "PLSS",
        "PLSE",
        "MISL",
        "BFS1",
        "BFE1",
        "BFE2",
        "TFOG",
        "IFOG",
        "PLAY",
        "POSS",
        "SPOS",
        "VILE",
        "FIRE",
        "FATB",
        "FBXP",
        "SKEL",
        "MANF",
        "FATT",
        "CPOS",
        "SARG",
        "HEAD",
        "BAL7",
        "BOSS",
        "BOS2",
        "SKUL",
        "SPID",
        "BSPI",
        "APLS",
        "APBX",
        "CYBR",
        "PAIN",
        "SSWV",
        "KEEN",
        "BBRN",
        "BOSF",
        "ARM1",
        "ARM2",
        "BAR1",
        "BEXP",
        "FCAN",
        "BON1",
        "BON2",
        "BKEY",
        "RKEY",
        "YKEY",
        "BSKU",
        "RSKU",
        "YSKU",
        "STIM",
        "MEDI",
        "SOUL",
        "PINV",
        "PSTR",
        "PINS",
        "MEGA",
        "SUIT",
        "PMAP",
        "PVIS",
        "CLIP",
        "AMMO",
        "ROCK",
        "BROK",
        "CELL",
        "CELP",
        "SHEL",
        "SBOX",
        "BPAK",
        "BFUG",
        "MGUN",
        "CSAW",
        "LAUN",
        "PLAS",
        "SHOT",
        "SGN2",
        "COLU",
        "SMT2",
        "GOR1",
        "POL2",
        "POL5",
        "POL4",
        "POL3",
        "POL1",
        "POL6",
        "GOR2",
        "GOR3",
        "GOR4",
        "GOR5",
        "SMIT",
        "COL1",
        "COL2",
        "COL3",
        "COL4",
        "CAND",
        "CBRA",
        "COL6",
        "TRE1",
        "TRE2",
        "ELEC",
        "CEYE",
        "FSKU",
        "COL5",
        "TBLU",
        "TGRN",
        "TRED",
        "SMBT",
        "SMGT",
        "SMRT",
        "HDB1",
        "HDB2",
        "HDB3",
        "HDB4",
        "HDB5",
        "HDB6",
        "POB1",
        "POB2",
        "BRS1",
        "TLMP",
        "TLP2",
        "TNT1",
        "DOGS",
        "PLS1",
        "PLS2",
        "BON3",
        "BON4",
        "BLD2",
    };

    private static readonly string DoomVersionName = "Doom version";
    private static readonly string PatchFormatName = "Patch format";

    private static readonly string ThingName = "Thing";
    private static readonly string FrameName = "Frame";
    private static readonly string SoundName = "Sound";
    private static readonly string AmmoName = "Ammo";
    private static readonly string WeaponName = "Weapon";
    private static readonly string CheatName = "Cheat";
    private static readonly string MiscName = "Misc";
    private static readonly string TextName = "Text";
    private static readonly string PointerName = "Pointer";

    private static readonly string BexStringName = "[Strings]";
    private static readonly string BexPointerName = "[CodePtr]";
    private static readonly string BexParName = "[Pars]";
    private static readonly string BexSoundName = "[Sounds]";
    private static readonly string BexSpriteName = "[Sprites]";

    private readonly HashSet<string> BaseTypes = new(StringComparer.OrdinalIgnoreCase)
    {
        ThingName,
        FrameName,
        SoundName,
        AmmoName,
        WeaponName,
        CheatName,
        MiscName,
        TextName,
        PointerName
    };

    private readonly HashSet<string> BexBaseTypes = new(StringComparer.OrdinalIgnoreCase)
    {
        BexStringName,
        BexPointerName,
        BexParName,
        BexSoundName,
        BexSpriteName
    };

    public struct DefaultArgs
    {
        public int Args1;
        public int Args2;
        public int Args3;
        public int Args4;
        public int Args5;
        public int Args6;
        public int Args7;
        public int Args8;
    }

    public static readonly Dictionary<ActionFunction, DefaultArgs> DefaultFrameArgs = new()
    {
        { A_WeaponBulletAttack, new DefaultArgs() { Args3 = 1, Args4 = 5, Args5 = 3 } },
        { A_WeaponMeleeAttack, new DefaultArgs() { Args1 = 2, Args2 = 10, Args3 = 65536 } },
    };

    private static readonly string IDNumber = "ID #";
    private static readonly string InitFrame = "Initial frame";
    private static readonly string Hitpoints = "Hit points";
    private static readonly string FirstMovingFrame = "First moving frame";
    private static readonly string AlertSound = "Alert sound";
    private static readonly string ReactionTime = "Reaction time";
    private static readonly string AttackSound = "Attack sound";
    private static readonly string InjuryFrame = "Injury frame";
    private static readonly string PainChance = "Pain chance";
    private static readonly string PainSound = "Pain sound";
    private static readonly string CloseAttackFrame = "Close attack frame";
    private static readonly string FarAttackFrame = "Far attack frame";
    private static readonly string DeathFrame = "Death frame";
    private static readonly string ExplodingFrame = "Exploding frame";
    private static readonly string DeathSound = "Death sound";
    private static readonly string Speed = "Speed";
    private static readonly string Width = "Width";
    private static readonly string Height = "Height";
    private static readonly string Mass = "Mass";
    private static readonly string MisileDamage = "Missile damage";
    private static readonly string ActionSound = "Action sound";
    private static readonly string Bits = "Bits";
    private static readonly string RespawnFrame = "Respawn frame";
    private static readonly string DroppedItem = "Dropped item";
    private static readonly string InfightingGroup = "Infighting group";
    private static readonly string ProjectileGroup = "Projectile group";
    private static readonly string SplashGroup = "Splash group";
    private static readonly string Mbf21Bits = "MBF21 Bits";
    private static readonly string RipSound = "Rip sound";
    private static readonly string FastSpeed = "Fast speed";
    private static readonly string MeleeRange = "Melee range";
    private static readonly string GibHealth = "Gib health";

    private static readonly string Duration = "Duration";
    private static readonly string SpriteNum = "Sprite number";
    private static readonly string SpriteSubNum = "Sprite subnumber";
    private static readonly string NextFrame = "Next frame";
    private static readonly string Unknown1 = "Unknown 1";
    private static readonly string Unknown2 = "Unknown 2";

    private static readonly string MaxAmmo = "Max ammo";
    private static readonly string PerAmmo = "Per ammo";

    private static readonly string AmmoType = "Ammo type";
    private static readonly string AmmoUse = "Ammo use";
    private static readonly string MinAmmo = "Min ammo";
    private static readonly string DeselectFrame = "Deselect frame";
    private static readonly string SelectFrame = "Select frame";
    private static readonly string BobbingFrame = "Bobbing frame";
    private static readonly string ShootingFrame = "Shooting frame";
    private static readonly string FiringFrame = "Firing frame";

    private static readonly string ChangeMusic = "Change music";
    private static readonly string Chainsaw = "Chainsaw";
    private static readonly string God = "God mode";
    private static readonly string AmmoAndKeys = "Ammo & Keys";
    private static readonly string AmmoCheat = "Ammo";
    private static readonly string NoClip1 = "No Clipping 1";
    private static readonly string NoClip2 = "No Clipping 2";
    private static readonly string Invincibility = "Invincibility";
    private static readonly string Berserk = "Berserk";
    private static readonly string Invisibility = "Invisibility";
    private static readonly string RadSuit = "Radiation Suit";
    private static readonly string AutoMap = "Auto-map";
    private static readonly string LiteAmp = "Lite-amp Goggles";
    private static readonly string Behold = "BEHOLD menu";
    private static readonly string LevelWarp = "Level Warp";
    private static readonly string MapCheat = "Map cheat";
    private static readonly string PlayerPos = "Player Position";

    private static readonly string InitialHealth = "Initial Health";
    private static readonly string InitialBullets = "Initial Bullets";
    private static readonly string MaxHealth = "Max Health";
    private static readonly string MaxArmor = "Max Armor";
    private static readonly string GreenArmorClass = "Green Armor Class";
    private static readonly string BlueArmorClass = "Blue Armor Class";
    private static readonly string MaxSoulsphere = "Max Soulsphere";
    private static readonly string SoulsphereHealth = "Soulsphere Health";
    private static readonly string MegasphereHealth = "Megasphere Health";
    private static readonly string GodModeHealth = "God Mode Health";
    private static readonly string IDFAArmor = "IDFA Armor";
    private static readonly string IDFAArmorClass = "IDFA Armor Class";
    private static readonly string IDKFAArmor = "IDKFA Armor";
    private static readonly string IDKFAArmorClass = "IDKFA Armor Class";
    private static readonly string BFGCellsPerShot = "BFG Cells/Shot";
    private static readonly string MonstersInfight = "Monsters Infight";
    private static readonly string MonstersIgnore = "Monsters Ignore Each Other";
    private static readonly string AmmoPerShot = "Ammo per shot";

    private static readonly string SoundOffset = "Offset";
    private static readonly string SoundZeroOne = "Zero/One";
    private static readonly string SoundValue = "Value";
    private static readonly string SoundZero1 = "Zero 1";
    private static readonly string SoundZero2 = "Zero 2";
    private static readonly string SoundZero3 = "Zero 3";
    private static readonly string SoundZero4 = "Zero 4";
    private static readonly string NegOne1 = "Neg. One 1";
    private static readonly string NegOne2 = "Neg. One 2";

    private static readonly string[] IgnoreSoundProperties = new string[] { SoundOffset, SoundZero1, SoundZero2, SoundZero3, SoundZero4, NegOne1, NegOne2 };
}
